/ Hex Artifact Content
Login

Artifact b23e50bc7aa99e3b264537243a4f5cd2663d0734:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7360: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7370: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7380: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
7390: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
73a0: 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73   opertion.  Clas
73b0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
73c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
73d0: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
73e0: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
73f0: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7400: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7410: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7420: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7430: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7440: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7450: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7460: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
7470: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
7480: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
7490: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
74a0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
74b0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
74c0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
74d0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
74e0: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
74f0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7500: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7510: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7520: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7530: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7550: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7560: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
7570: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
7580: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
75a0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
75b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
75c0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
75d0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
75e0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
75f0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7600: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7610: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7630: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7640: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7650: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7660: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
7670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7680: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
7690: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
76a0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64  n-zero */.  u8 d
76b0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20  oNotSyncSpill;  
76c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
76d0: 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61  t do a spill tha
76e0: 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20  t requires jrnl 
76f0: 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62  sync */.  u8 sub
7700: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
7710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7720: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
7730: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
7740: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7770: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7780: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
7790: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
77b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
77c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
77d0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
7800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7810: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48  le */.  Pgno dbH
7820: 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  intSize;        
7830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73      /* Value pas
7840: 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a  sed to FCNTL_SIZ
7850: 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20  E_HINT call */. 
7860: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7880: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
7890: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
78a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
78d0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
78e0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
78f0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
7900: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
7910: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
7920: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
7930: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
7940: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
7970: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
7980: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7990: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
79a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
79b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
79c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
79d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
79e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
79f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7a00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7a10: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7a30: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7a40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7a50: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a70: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7a80: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a90: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
7aa0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
7ac0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ad0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7af0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
7b00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
7b10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
7b20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
7b30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
7b40: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
7b50: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
7b60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
7b70: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
7b80: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
7b90: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
7ba0: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
7bb0: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
7bd0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
7c00: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
7c10: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
7c20: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7c30: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7c40: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7c50: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7c60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
7c70: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
7c80: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
7c90: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
7cf0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
7d00: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
7d10: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
7d20: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
7d30: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
7d40: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
7d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d60: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
7d70: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
7d80: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
7d90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7da0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
7db0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
7dc0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
7dd0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
7de0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
7df0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
7e00: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
7e10: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7e40: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
7e50: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
7e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7e70: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
7e80: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
7e90: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
7ea0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7eb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
7ec0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
7ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
7ee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
7ef0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
7f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7f10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7f20: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
7f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
7f50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7f60: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
7f70: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
7f80: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
7f90: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
7fa0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
7fb0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
7fc0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
7fd0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
7fe0: 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  /.  int nHit, nM
7ff0: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
8000: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
8010: 69 74 73 20 61 6e 64 20 6d 69 73 73 65 73 20 2a  its and misses *
8020: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8030: 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64  TEST.  int nRead
8040: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
8050: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
8060: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
8070: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
8080: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8090: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
80a0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
80b0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
80c0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
80d0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
80e0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
80f0: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8100: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
8110: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
8120: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
8130: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
8140: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
8150: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
8160: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8170: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8180: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8190: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
81a0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
81b0: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
81c0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
81e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
81f0: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8200: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
8210: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
8220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8230: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
8240: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
8250: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
8260: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8280: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8290: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
82a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
82b0: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
82e0: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
82f0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8300: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
8330: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
8340: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
8350: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
8360: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
8370: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
8380: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
8390: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
83a0: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
83b0: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
83c0: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
83d0: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
83e0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
83f0: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
8400: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
8410: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
8420: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
8430: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
8440: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8450: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
8460: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
8470: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
8480: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
8490: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
84a0: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
84b0: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
84c0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
84d0: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
84e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
84f0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
8500: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69  ournal */.# defi
8510: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
8520: 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    v++.#else.# de
8530: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8540: 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  v).#endif..../*.
8550: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
8560: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
8570: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
8580: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
8590: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
85a0: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
85b0: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
85c0: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
85d0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
85e0: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
85f0: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
8600: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
8610: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
8620: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
8630: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
8640: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
8650: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
8660: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74  is being.** writ
8670: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
8680: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
8690: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
86a0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
86b0: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
86c0: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
86d0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
86e0: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
86f0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
8700: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
8710: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
8720: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
8730: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
8740: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
8750: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
8760: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
8770: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
8780: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
8790: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
87a0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
87b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
87c0: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
87d0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
87e0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
87f0: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
8800: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
8810: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
8820: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
8830: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
8840: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8850: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
8860: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
8870: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
8880: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
8890: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
88a0: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
88b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
88c0: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
88d0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
88e0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
88f0: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
8900: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
8910: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
8920: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
8930: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
8940: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
8950: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
8960: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
8970: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
8980: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
8990: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
89a0: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
89b0: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
89c0: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
89d0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
89e0: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
89f0: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
8a00: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
8a10: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
8a20: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
8a30: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
8a40: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
8a50: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
8a60: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
8a70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
8a80: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
8a90: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
8aa0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
8ab0: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
8ac0: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
8ad0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20   size of the of 
8ae0: 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64  each page record
8af0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
8b00: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74  is given by.** t
8b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
8b20: 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ro..*/.#define J
8b30: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
8b40: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
8b50: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
8b60: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
8b70: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
8b80: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  r this pager. Th
8b90: 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68  is is usually th
8ba0: 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20  e same .** size 
8bb0: 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  as a single disk
8bc0: 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73   sector. See als
8bd0: 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  o setSectorSize(
8be0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  )..*/.#define JO
8bf0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8c00: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
8c10: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
8c20: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
8c30: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
8c40: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
8c50: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
8c60: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
8c70: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
8c80: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
8c90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8ca0: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
8cb0: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
8cc0: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
8cd0: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
8ce0: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
8cf0: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
8d00: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
8d10: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
8d20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8d30: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
8d40: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
8d50: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
8d60: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
8d70: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
8d80: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
8d90: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
8da0: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
8db0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
8dc0: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
8dd0: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
8de0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
8df0: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
8e00: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
8e10: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
8e20: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
8e30: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
8e40: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
8e50: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
8e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
8e70: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
8e80: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
8e90: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
8ea0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
8eb0: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
8ec0: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
8ed0: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
8ee0: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
8ef0: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
8f00: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
8f10: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
8f20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
8f30: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
8f40: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
8f50: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
8f60: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
8f70: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
8f80: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
8f90: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
8fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
8fb0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
8fc0: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
8fd0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
8fe0: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
8ff0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9000: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9010: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9020: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
9030: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9040: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
9050: 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65 20  y,z) 0.# define 
9060: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9070: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9080: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9090: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
90a0: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
90b0: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
90c0: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
90d0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
90e0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
90f0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
9100: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
9110: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
9120: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
9130: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9140: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9150: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9160: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9170: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9180: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9190: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
91a0: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
91b0: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
91c0: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
91d0: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
91e0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
91f0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
9200: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9210: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
9220: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9230: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9240: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9250: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9260: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9270: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9280: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9290: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
92a0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
92b0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
92c0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
92d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
92e0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
92f0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
9300: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
9310: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
9320: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
9330: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9340: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9350: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9360: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9370: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9380: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9390: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
93a0: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
93b0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
93c0: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
93d0: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
93e0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
93f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
9400: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9410: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
9420: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
9430: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9440: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9450: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9460: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9470: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9480: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9490: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
94a0: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
94b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
94c0: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
94d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
94e0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
94f0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9500: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
9510: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
9520: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9530: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
9540: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
9550: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
9560: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
9570: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
9580: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
9590: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
95a0: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
95b0: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
95c0: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
95d0: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
95e0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
95f0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
9600: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
9610: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
9620: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
9630: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
9640: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
9650: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
9660: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
9670: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
9680: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
9690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
96a0: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
96b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
96c0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
96d0: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
96e0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
96f0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
9700: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
9710: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
9720: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
9730: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
9740: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9750: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61  >noSync );.    a
9760: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9770: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9780: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9790: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
97a0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
97b0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
97c0: 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  RY .    );.    a
97d0: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
97e0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
97f0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9800: 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73  R_OPEN );.    as
9810: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
9820: 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  l(p)==0 );.  }..
9830: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f    /* If changeCo
9840: 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20  untDone is set, 
9850: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9860: 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
9870: 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20  be held.  ** on 
9880: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9890: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
98a0: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
98b0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
98c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
98d0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
98e0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49   p->eLock!=PENDI
98f0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77  NG_LOCK );..  sw
9900: 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20  itch( p->eState 
9910: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
9920: 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73  R_OPEN:.      as
9930: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9950: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9960: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9970: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9980: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
9990: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
99a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
99b0: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
99c0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
99d0: 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a  e PAGER_READER:.
99e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
99f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9a00: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9a10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9a20: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9a30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9a40: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
9a50: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f  ED_LOCK || p->no
9a60: 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  Readlock );.    
9a70: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
9a80: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
9a90: 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73  LOCKED:.      as
9aa0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
9ab0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
9ac0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9ad0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9ae0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9af0: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
9b00: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
9b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9b20: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
9b30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
9b40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9b50: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70  Pager->dbSize==p
9b60: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9b70: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9b80: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
9b90: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
9ba0: 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  bFileSize );.   
9bb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9bc0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
9bd0: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
9be0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9bf0: 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
9c00: 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ster==0 );.     
9c10: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9c20: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  e PAGER_WRITER_C
9c30: 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61  ACHEMOD:.      a
9c40: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9c50: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9c60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9c70: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9c90: 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65     if( !pagerUse
9ca0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
9cb0: 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20         /* It is 
9cc0: 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66  possible that if
9cd0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
9ce0: 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74  l here that neit
9cf0: 68 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20  her the.        
9d00: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
9d10: 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65  nor the WAL file
9d20: 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20   are open. This 
9d30: 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20  happens during. 
9d40: 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c         ** a roll
9d50: 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e  back transaction
9d60: 20 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66   that switches f
9d70: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  rom journal_mode
9d80: 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  =off.        ** 
9d90: 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  to journal_mode=
9da0: 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  wal..        */.
9db0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9dc0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9dd0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9de0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
9df0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
9e00: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
9e10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9e20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9e30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
9e40: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
9e50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9e60: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20  ODE_WAL .       
9e70: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9e80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9e90: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
9ea0: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
9eb0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9ec0: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
9ed0: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
9ee0: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
9ef0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
9f00: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
9f10: 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  DBMOD:.      ass
9f20: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
9f30: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9f40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f50: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9f60: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9f70: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
9f80: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9f90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9fa0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55   p->eLock>=EXCLU
9fb0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9fc0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
9fd0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
9fe0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9ff0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a000: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a010: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a020: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a030: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a040: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a050: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a060: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d  er->dbOrigSize<=
a070: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a080: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a090: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a0a0: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
a0b0: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a0c0: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a0d0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a100: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a110: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a120: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a140: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a150: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a160: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a170: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a180: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a190: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a1a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a1b0: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a1c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a1d0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52     case PAGER_ER
a1e0: 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68  ROR:.      /* Th
a1f0: 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
a200: 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
a210: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74  ding reference t
a220: 6f 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20  o the pager if. 
a230: 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52       ** in ERROR
a240: 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
a250: 65 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75  e the pager shou
a260: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
a270: 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a  dropped.      **
a280: 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
a290: 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
a2a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a2b0: 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
a2c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a2d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a2e0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a2f0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
a300: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a310: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
a320: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
a330: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
a340: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a350: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
a360: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
a370: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
a380: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
a390: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
a3a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
a3b0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
a3c0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a3d0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
a3e0: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
a3f0: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
a400: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
a410: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
a420: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
a430: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
a440: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
a450: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
a460: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
a470: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
a480: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
a490: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a4a0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
a4b0: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
a4c0: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
a4d0: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
a4e0: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
a4f0: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
a500: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
a510: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
a520: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
a530: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
a540: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
a550: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
a560: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
a570: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
a580: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
a590: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
a5a0: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
a5b0: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
a5c0: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
a5d0: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
a5e0: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
a5f0: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
a600: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
a610: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
a620: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
a630: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
a640: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
a650: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
a660: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
a670: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
a680: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
a690: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a6a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
a6b0: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
a6c0: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
a6d0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a6e0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
a6f0: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
a700: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a710: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
a720: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
a730: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
a740: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a750: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a760: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
a770: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
a780: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a790: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a7a0: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
a7b0: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
a7c0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a7d0: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
a7e0: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
a7f0: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
a800: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
a810: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
a820: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
a830: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
a840: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
a850: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
a860: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
a870: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
a880: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a890: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
a8a0: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
a8b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
a8c0: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
a8d0: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
a8e0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
a8f0: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
a900: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
a910: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
a920: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
a930: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
a940: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
a950: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a960: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
a970: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
a980: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
a990: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a9a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a9b0: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
a9c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
a9d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a9e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
a9f0: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
aa00: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
aa10: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
aa20: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
aa30: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
aa40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aa50: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aa60: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
aa70: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
aa80: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
aa90: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
aaa0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
aab0: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
aac0: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
aad0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
aae0: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
aaf0: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
ab00: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
ab10: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
ab20: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
ab30: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
ab40: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
ab50: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
ab60: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
ab70: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
ab80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
ab90: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
aba0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
abb0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
abc0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
abd0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
abe0: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
abf0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
ac00: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
ac10: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
ac20: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
ac30: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
ac40: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
ac50: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
ac60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
ac70: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
ac80: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
ac90: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
aca0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
acb0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
acc0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
acd0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
ace0: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
acf0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
ad00: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
ad10: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
ad20: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
ad30: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
ad40: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
ad50: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
ad60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ad70: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ad80: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
ad90: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
ada0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
adb0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
adc0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
add0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
ade0: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
adf0: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
ae00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
ae10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
ae20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ae30: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
ae40: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
ae50: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
ae60: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
ae70: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
ae80: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
ae90: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
aea0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
aeb0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
aec0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
aed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
aee0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
aef0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
af00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
af10: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
af20: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
af30: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
af40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
af50: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
af60: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
af70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
af80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
af90: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
afa0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
afb0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
afc0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
afd0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
afe0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
aff0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
b000: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
b010: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
b020: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
b030: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
b040: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
b050: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
b060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b070: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
b080: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
b090: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b0a0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b0b0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b0c0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
b0d0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
b0e0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
b0f0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
b100: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
b110: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
b120: 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  B).../*.** Write
b130: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b140: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
b150: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b160: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b170: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
b180: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
b190: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
b1a0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
b1b0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
b1c0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
b1d0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
b1e0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
b1f0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
b200: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
b210: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
b220: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
b230: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
b240: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
b250: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b260: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
b270: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
b280: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20  ther NO_LOCK.** 
b290: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20  or SHARED_LOCK. 
b2a0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
b2b0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
b2c0: 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b   call to xUnlock
b2d0: 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20  ().** succeeds, 
b2e0: 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c  set the Pager.eL
b2f0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
b300: 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d  match the (attem
b310: 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a  pted) new lock..
b320: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
b330: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
b340: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
b350: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
b360: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
b370: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
b380: 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63  fy it. See the c
b390: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
b3a0: 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20   #define of .** 
b3b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
b3c0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
b3d0: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
b3e0: 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f  ic int pagerUnlo
b3f0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
b400: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
b410: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b420: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
b430: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
b440: 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
b450: 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20  r->eLock==eLock 
b460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b470: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck==NO_LOCK || e
b480: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b490: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
b4a0: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
b4b0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
b4c0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ger)==0 );.  if(
b4d0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
b4e0: 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
b4f0: 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
b500: 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72  >=eLock );.    r
b510: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  c = sqlite3OsUnl
b520: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
b530: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
b540: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
b550: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
b560: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
b570: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
b580: 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
b590: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64  E(("UNLOCK %p %d
b5a0: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f  \n", pPager, eLo
b5b0: 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck)).  }.  retur
b5c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
b5d0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b5e0: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b5f0: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b600: 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52 45   be either SHARE
b610: 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52  D_LOCK,.** RESER
b620: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
b630: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74  USIVE_LOCK. If t
b640: 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63  he caller is suc
b650: 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
b660: 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  .** Pager.eLock 
b670: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
b680: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b690: 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  e. .**.** Except
b6a0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b6b0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b6c0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b6d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  s function is .*
b6e0: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
b6f0: 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73   modify it unles
b700: 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  s the new lockin
b710: 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c 55  g state is EXCLU
b720: 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53  SIVE_LOCK. .** S
b730: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
b740: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
b750: 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   of UNKNOWN_LOCK
b760: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b770: 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e  ion .** of this.
b780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b790: 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72  agerLockDb(Pager
b7a0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b7b0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b7c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b7d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48  ssert( eLock==SH
b7e0: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ARED_LOCK || eLo
b7f0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
b800: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c  K || eLock==EXCL
b810: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
b820: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b830: 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65  k<eLock || pPage
b840: 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
b850: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  N_LOCK ){.    rc
b860: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
b870: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
b880: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
b890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
b8a0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
b8b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
b8c0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
b8d0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
b8e0: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
b8f0: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
b900: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
b910: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
b920: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
b930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b940: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b950: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
b960: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b970: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
b980: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
b990: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
b9a0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
b9b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
b9c0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
b9d0: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
b9e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
b9f0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
ba00: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
ba10: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
ba20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
ba30: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
ba40: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
ba50: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
ba60: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
ba70: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
ba80: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ba90: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
baa0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
bab0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
bac0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
bad0: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
bae0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
baf0: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
bb00: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
bb10: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
bb20: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
bb30: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
bb40: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
bb50: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
bb60: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
bb70: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
bb80: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
bb90: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
bba0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
bbb0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
bbc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
bbd0: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
bbe0: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
bbf0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
bc00: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
bc10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
bc20: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
bc30: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
bc40: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
bc50: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
bc60: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
bc70: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
bc80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
bcb0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
bcc0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
bcd0: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bcf0: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
bd00: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
bd30: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
bd40: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
bd50: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
bd60: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
bd70: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
bd80: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
bd90: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
bda0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
bdb0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
bdc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
bdd0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
bde0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
bdf0: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
be00: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
be10: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
be20: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
be30: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
be40: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
be50: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
be60: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
be70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
be80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
be90: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
bea0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
beb0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
bec0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
bed0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
bee0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
bef0: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
bf00: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
bf10: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
bf20: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
bf30: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
bf40: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
bf50: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
bf60: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
bf70: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bf80: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
bf90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
bfa0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
bfb0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
bfc0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
bfd0: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
bfe0: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
bff0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c000: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c010: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c020: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c030: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c040: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c050: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c060: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c070: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c080: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c090: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c0a0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c0b0: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c0c0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c0d0: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c0e0: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c0f0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c100: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c110: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
c120: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c130: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
c140: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
c150: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
c160: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
c170: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
c180: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c190: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
c1a0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
c1b0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
c1c0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
c1d0: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
c1e0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
c1f0: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
c200: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
c210: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
c220: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
c230: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
c240: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
c250: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
c260: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
c270: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
c280: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
c290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c2a0: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
c2b0: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
c2c0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
c2d0: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
c2e0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
c2f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
c300: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
c310: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
c320: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
c330: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
c340: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
c350: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
c360: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
c370: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
c380: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
c390: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
c3a0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
c3b0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
c3c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
c3d0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
c3e0: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
c3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
c400: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
c410: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c420: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
c430: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
c440: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
c450: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
c460: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
c470: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
c480: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
c490: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
c4a0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
c4b0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
c4c0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
c4d0: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
c4e0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
c4f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
c500: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
c510: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
c520: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
c530: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
c540: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
c550: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
c560: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
c570: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
c580: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
c590: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
c5a0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
c5b0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
c5c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c5d0: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
c5e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
c5f0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
c600: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
c610: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
c620: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
c630: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
c640: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
c650: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
c660: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c670: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
c680: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
c690: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
c6a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c6b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c6c0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
c6d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
c6e0: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
c6f0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
c700: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
c710: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
c720: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c730: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
c740: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
c750: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
c760: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
c770: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
c780: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
c790: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
c7a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c7b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c7c0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
c7d0: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
c7e0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
c7f0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
c800: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
c810: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
c820: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c830: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
c840: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c850: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
c860: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
c870: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
c880: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
c890: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
c8a0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
c8b0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
c8c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c8d0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
c8e0: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
c8f0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
c900: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
c910: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
c920: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
c950: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
c960: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
c970: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c990: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
c9a0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
c9b0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
c9e0: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
c9f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
ca00: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
ca10: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
ca20: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
ca30: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
ca40: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
ca50: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ca60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
ca70: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
ca80: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
ca90: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
caa0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
cab0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
cac0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
cad0: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
cae0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
caf0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
cb00: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
cb10: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
cb20: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cb30: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
cb40: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
cb50: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
cb60: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
cb70: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
cb80: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cb90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cba0: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
cbb0: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
cbc0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
cbd0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
cbe0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
cbf0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
cc00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cc10: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
cc20: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
cc30: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
cc40: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
cc50: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
cc60: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
cc70: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
cc80: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
cc90: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
cca0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
ccb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
ccc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ccd0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
cce0: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
ccf0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
cd00: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
cd10: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
cd20: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
cd30: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
cd40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
cd50: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
cd60: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
cd70: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
cd80: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
cd90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cda0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cdb0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
cdc0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
cdd0: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
cde0: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
cdf0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
ce00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ce10: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
ce20: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
ce30: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
ce40: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
ce50: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
ce60: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
ce70: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
ce80: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
ce90: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
cea0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
cef0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
cf00: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
cf10: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
cf30: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
cf60: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
cf70: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
cf80: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
cf90: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
cfa0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
cfb0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
cfc0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
cfd0: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
cfe0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
cff0: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
d000: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
d010: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d020: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
d030: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
d040: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
d050: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
d060: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
d070: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d080: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
d090: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
d0a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d0b0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d0c0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d0d0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d0e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d0f0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
d100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
d110: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
d120: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
d130: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
d140: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
d150: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d160: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
d170: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
d180: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
d190: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d1a0: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
d1b0: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
d1c0: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
d1d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d1e0: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
d1f0: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
d200: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
d210: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
d220: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
d230: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
d240: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
d250: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
d260: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
d270: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
d280: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
d290: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
d2a0: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
d2b0: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
d2c0: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
d2d0: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
d2e0: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
d2f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
d300: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
d310: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
d320: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
d330: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
d340: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
d350: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
d360: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
d370: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
d380: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
d390: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
d3a0: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
d3b0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
d3c0: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
d3d0: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
d3e0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
d3f0: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
d400: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
d410: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
d420: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
d430: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d440: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
d450: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
d460: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
d470: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
d480: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
d490: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
d4a0: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
d4b0: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
d4c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d4f0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d500: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
d510: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
d520: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
d530: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
d540: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
d550: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d560: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
d570: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d580: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
d590: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
d5a0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
d5b0: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
d5c0: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
d5d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d5e0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
d5f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
d600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d610: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
d620: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
d630: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
d640: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d650: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
d660: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
d670: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
d680: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
d690: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
d6a0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
d6b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d6c0: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
d6d0: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
d6e0: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
d6f0: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
d700: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
d710: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
d720: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
d730: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
d740: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
d750: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
d760: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
d770: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
d780: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
d790: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
d7a0: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
d7b0: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
d7c0: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
d7d0: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
d7e0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
d7f0: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
d800: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
d810: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
d820: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
d830: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
d840: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
d850: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
d860: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
d870: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
d880: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
d890: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
d8a0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
d8b0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
d8c0: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
d8d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d8e0: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
d8f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d900: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d910: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
d920: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
d930: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
d940: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
d950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
d960: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
d970: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d980: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
d990: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
d9a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
d9b0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
d9c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
d9d0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
d9e0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
d9f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
da00: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
da10: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
da20: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
da30: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
da40: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
da50: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
da60: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
da70: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
da80: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
da90: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
daa0: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
dab0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
dac0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
dad0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
dae0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
daf0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
db00: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
db10: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
db20: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
db30: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
db40: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
db50: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
db60: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
db70: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
db80: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
db90: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
dba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
dbb0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
dbc0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
dbd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dbe0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
dbf0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
dc00: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
dc10: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
dc20: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
dc30: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
dc40: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
dc50: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
dc60: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
dc70: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
dc80: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
dc90: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
dca0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
dcb0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcd0: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
dce0: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
dcf0: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
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 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dd20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
dd30: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
dd40: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
dd50: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
dd60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
dd70: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
dd80: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
dd90: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
dda0: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
ddb0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
ddc0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
ddd0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
dde0: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
ddf0: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
de00: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
de10: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
de20: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
de30: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
de40: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
de50: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
de60: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
de70: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
de80: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
de90: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
dea0: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
deb0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
dec0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
ded0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
dee0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
def0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
df00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
df10: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
df20: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
df30: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
df40: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
df50: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
df60: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
df70: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
df80: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
df90: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
dfa0: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
dfb0: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
dfc0: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
dfd0: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
dfe0: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
dff0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
e000: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
e010: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
e020: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e030: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
e040: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
e050: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
e060: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
e070: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
e080: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
e090: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
e0a0: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
e0b0: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
e0c0: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
e0d0: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
e0e0: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
e0f0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
e100: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
e110: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
e120: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
e130: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
e140: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
e150: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e160: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
e170: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e180: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
e190: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
e1a0: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
e1b0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e1c0: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
e1d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e1e0: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
e1f0: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
e200: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
e210: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
e220: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
e230: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
e240: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
e250: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
e260: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
e270: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
e280: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
e290: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
e2a0: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
e2b0: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
e2c0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e2d0: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
e2e0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
e2f0: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
e300: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
e310: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
e320: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
e330: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
e340: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
e350: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e360: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
e370: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e380: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e390: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
e3a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
e3b0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
e3c0: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
e3d0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
e3e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
e3f0: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
e400: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
e410: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
e420: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
e430: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
e440: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e450: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
e460: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e470: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e480: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
e490: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
e4a0: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
e4b0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
e4c0: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
e4d0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
e4e0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
e4f0: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
e500: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
e510: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
e520: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
e530: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e540: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
e550: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e560: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
e570: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
e580: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
e590: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
e5a0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
e5b0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e5c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e5d0: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
e5e0: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
e5f0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
e600: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
e610: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
e620: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e630: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e640: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
e650: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
e660: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
e670: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
e680: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e690: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e6a0: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
e6b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
e6c0: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
e6d0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
e6e0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
e6f0: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
e700: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
e710: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
e720: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
e730: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
e740: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
e750: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
e760: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
e770: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
e780: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
e790: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
e7a0: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
e7b0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
e7c0: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
e7d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e7e0: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
e7f0: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
e800: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e810: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
e820: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
e830: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
e840: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
e850: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
e860: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
e870: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
e880: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
e890: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
e8a0: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
e8b0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
e8c0: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
e8d0: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
e8e0: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
e8f0: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
e900: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
e910: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
e920: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
e930: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
e940: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
e950: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
e960: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
e970: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
e980: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
e990: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
e9a0: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
e9b0: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
e9c0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
e9d0: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
e9e0: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
e9f0: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
ea00: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
ea10: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
ea20: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
ea30: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
ea40: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
ea50: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
ea60: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
ea70: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
ea80: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
ea90: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
eaa0: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
eab0: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
eac0: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
ead0: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
eae0: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
eaf0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
eb00: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
eb10: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
eb20: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
eb30: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
eb40: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
eb50: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
eb60: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
eb70: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
eb80: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
eb90: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
eba0: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
ebb0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
ebc0: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
ebd0: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
ebe0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ebf0: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
ec00: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
ec10: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
ec20: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
ec30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ec40: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
ec50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ec60: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
ec70: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
ec80: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
ec90: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
eca0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
ecb0: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
ecc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
ecd0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
ece0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
ecf0: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
ed00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ed10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
ed20: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
ed30: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
ed40: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
ed50: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
ed60: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
ed70: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
ed80: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
ed90: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
eda0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
edb0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
edc0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
edd0: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
ede0: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
edf0: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
ee00: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
ee10: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
ee20: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
ee30: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
ee40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
ee50: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
ee60: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
ee70: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
ee80: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
ee90: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
eea0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
eeb0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
eec0: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
eed0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
eee0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
eef0: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
ef00: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
ef10: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
ef20: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
ef30: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
ef40: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
ef50: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
ef60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
ef70: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
ef80: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
ef90: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
efa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
efb0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
efc0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
efd0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
efe0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
eff0: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
f000: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
f010: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
f020: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
f030: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
f040: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f050: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
f060: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f070: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f080: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
f090: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0b0: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
f0c0: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
f0d0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f0f0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
f100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
f110: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
f120: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
f130: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f140: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
f150: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
f160: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
f190: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
f1a0: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
f1b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f1e0: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
f1f0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
f200: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
f210: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
f220: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
f230: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f250: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
f260: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
f270: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
f280: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
f290: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
f2a0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
f2b0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
f2c0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
f2d0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
f2e0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f2f0: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
f300: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
f310: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
f320: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
f330: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
f340: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
f350: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
f360: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
f370: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
f380: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
f390: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
f3a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f3b0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
f3c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
f3d0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
f3e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f3f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
f400: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
f410: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
f420: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
f430: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
f440: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
f450: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
f460: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
f470: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
f480: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
f490: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
f4a0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
f4b0: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
f4c0: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
f4d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
f4e0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
f4f0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
f500: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
f510: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
f520: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
f530: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
f540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f550: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
f560: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
f570: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
f580: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
f590: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f5a0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
f5b0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
f5c0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
f5d0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
f5e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
f5f0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f610: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
f620: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
f630: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
f640: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
f650: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
f660: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
f670: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
f680: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
f690: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
f6a0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f6b0: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
f6c0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
f6d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
f6e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
f6f0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f700: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f710: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
f720: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
f730: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f740: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f750: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
f760: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
f770: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
f780: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f790: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f7a0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
f7b0: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
f7c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f7d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
f7e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
f7f0: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
f800: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
f810: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
f820: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
f830: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
f840: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
f850: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
f860: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
f870: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
f880: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
f890: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
f8a0: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
f8b0: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
f8c0: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
f8d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f8e0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
f8f0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
f900: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
f910: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
f920: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
f930: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f940: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f950: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
f960: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
f970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f980: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
f990: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
f9a0: 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
f9b0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
f9c0: 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
f9d0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f9e0: 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
f9f0: 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
fa00: 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
fa10: 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
fa20: 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
fa30: 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
fa40: 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
fa50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
fa60: 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
fa70: 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
fa80: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
fa90: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
faa0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
fab0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
fac0: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
fad0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
fae0: 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
faf0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
fb00: 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
fb10: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
fb20: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
fb30: 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
fb40: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
fb50: 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
fb60: 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
fb70: 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
fb80: 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
fb90: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
fba0: 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
fbb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
fbc0: 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
fbd0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
fbe0: 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
fbf0: 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
fc00: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
fc10: 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
fc20: 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
fc30: 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
fc40: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
fc50: 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
fc60: 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
fc70: 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
fc80: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
fc90: 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
fca0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
fcb0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
fcc0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fcd0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
fce0: 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
fcf0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
fd00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
fd10: 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
fd20: 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
fd30: 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
fd40: 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
fd50: 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
fd60: 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
fd70: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
fd80: 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
fd90: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
fda0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
fdb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
fdc0: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
fdd0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
fde0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
fdf0: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
fe00: 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
fe10: 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
fe20: 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
fe30: 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
fe40: 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
fe50: 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
fe60: 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
fe70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
fe80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
fe90: 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
fea0: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
feb0: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
fec0: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
fed0: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
fee0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
fef0: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
ff00: 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
ff10: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
ff20: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
ff30: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
ff40: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
ff50: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
ff60: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
ff70: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
ff80: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
ff90: 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
ffa0: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
ffb0: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
ffc0: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
ffd0: 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
ffe0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
fff0: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
10000 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
10010 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
10020 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
10030 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
10040 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
10050 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10060 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10070 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
10080 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10090 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
100a0 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
100b0 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
100c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
100d0 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
100e0 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
100f0 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
10100 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10110 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
10120 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
10130 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
10140 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
10150 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
10160 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
10170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
10180 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10190 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
101a0 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
101b0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
101c0 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
101d0 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
101e0 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
101f0 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
10200 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
10210 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10220 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
10230 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
10240 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
10250 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10260 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
10270 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
10280 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10290 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
102a0 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
102b0 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
102c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
102d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
102e0 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
102f0 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
10300 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
10310 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
10320 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
10330 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
10340 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
10350 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
10360 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
10370 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
10380 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
10390 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
103a0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
103b0 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
103c0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
103d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
103e0 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
103f0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10400 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10410 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
10420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10440 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10450 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
10480 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
10490 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
104c0 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
104d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
104e0 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10500 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
10510 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
10520 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
10550 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
10560 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
10570 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
10580 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10590 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
105a0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
105b0 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
105c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
105d0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
105e0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
105f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
10600 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
10610 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
10620 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
10630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10640 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10650 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
10660 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
10670 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
10680 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
10690 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
106a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a  >journalOff );..
106b0 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
106c0 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74  he length in byt
106d0 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  es and the check
106e0 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a  sum of zMaster *
106f0 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d  /.  for(nMaster=
10700 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  0; zMaster[nMast
10710 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b  er]; nMaster++){
10720 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
10730 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a  aster[nMaster];.
10740 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
10750 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10760 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
10770 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
10780 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
10790 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
107a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
107b0 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
107c0 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
107d0 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
107e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
107f0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
10800 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
10810 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
10820 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
10830 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
10840 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
10850 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72  ger);.  }.  iHdr
10860 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
10870 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
10880 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
10890 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f   journal data to
108a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
108b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
108c0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
108d0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68  ccurs, return th
108e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
108f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f  the caller..  */
10900 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63  .  if( (0 != (rc
10910 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10920 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10930 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
10940 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20  NO(pPager)))).  
10950 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10960 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
10970 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
10980 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48  ter, nMaster, iH
10990 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c  drOff+4))).   ||
109a0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
109b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
109c0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
109d0 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
109e0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
109f0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10a00 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10a10 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10a20 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20  +4, cksum))).   
10a30 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
10a40 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
10a50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
10a60 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64  nalMagic, 8, iHd
10a70 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
10a80 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
10a90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
10aa0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10ab0 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
10ac0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
10ad0 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
10ae0 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
10af0 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
10b00 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
10b10 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
10b20 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
10b30 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
10b40 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
10b50 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
10b60 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
10b70 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
10b80 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
10b90 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
10ba0 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
10bb0 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
10bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
10bd0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
10be0 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
10bf0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
10c00 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
10c10 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
10c20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
10c30 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
10c40 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
10c50 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
10c60 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
10c70 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
10c80 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
10c90 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
10ca0 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
10cb0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
10cc0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10cd0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
10ce0 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
10cf0 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
10d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
10d10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10d20 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
10d30 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
10d40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
10d50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
10d70 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
10d80 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
10d90 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
10da0 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
10db0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
10dc0 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
10dd0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10de0 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
10df0 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
10e00 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
10e10 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
10e20 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
10e30 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10e60 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
10e70 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
10e80 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
10e90 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
10ea0 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
10eb0 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
10ec0 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
10ed0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
10ee0 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
10ef0 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
10f00 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
10f10 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
10f20 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
10f30 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
10f40 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
10f50 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
10f60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10f70 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
10f80 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
10f90 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
10fa0 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
10fb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  ){.  sqlite3Back
10fc0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
10fd0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
10fe0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
10ff0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11000 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
11010 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11020 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11030 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11040 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11050 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11060 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11070 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11080 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11090 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
110a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
110b0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
110c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
110d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
110e0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
110f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11100 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11120 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11130 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11140 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11150 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11160 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11170 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11180 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11190 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
111a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
111b0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
111c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
111d0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
111e0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
111f0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11200 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11210 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11220 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11230 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11240 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11250 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11260 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11270 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11280 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11290 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
112a0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
112b0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
112c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
112d0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
112e0 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
112f0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11310 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11320 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11330 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11340 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11350 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11360 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11370 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11380 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11390 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
113a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
113b0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
113c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
113d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
113e0 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
113f0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11400 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11410 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11420 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11430 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11440 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11450 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11460 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11470 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11480 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
114a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
114b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
114c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
114d0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
114e0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
114f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11500 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11510 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11520 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
11530 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
11540 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
11550 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11560 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
11570 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
11580 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11590 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
115a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
115b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
115c0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
115d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
115e0 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
115f0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
11600 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11610 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11620 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11630 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11640 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11650 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11670 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11680 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11690 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
116a0 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
116b0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
116c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
116d0 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
116e0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
116f0 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
11700 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
11710 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
11720 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
11730 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
11740 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
11750 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11760 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
11770 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
11780 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
11790 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
117a0 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
117b0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
117c0 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
117d0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
117e0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
117f0 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
11800 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
11810 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11820 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
11830 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
11840 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
11850 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11860 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11870 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
11880 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11890 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
118a0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
118b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
118c0 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
118d0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
118e0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
118f0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
11900 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
11910 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
11920 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
11930 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
11940 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
11950 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11960 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
11970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
11980 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
11990 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
119a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
119b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
119c0 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
119d0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
119e0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
119f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11a10 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
11a20 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
11a30 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
11a40 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
11a50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
11a60 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
11a70 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
11a80 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
11a90 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
11aa0 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
11ab0 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
11ac0 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
11ad0 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
11ae0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
11af0 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
11b00 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
11b10 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
11b20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11b30 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
11b40 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
11b50 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
11b60 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
11b70 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
11b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11b90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11ba0 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
11bb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11bc0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11bd0 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
11be0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11bf0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11c00 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
11c10 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11c20 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11c30 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
11c40 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11c50 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11c60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
11c70 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
11c80 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11c90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
11ca0 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
11cb0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
11cc0 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
11cd0 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
11ce0 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
11cf0 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
11d00 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
11d10 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
11d20 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11d30 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
11d40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
11d50 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
11d60 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
11d70 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
11d80 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
11d90 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
11da0 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
11db0 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
11dc0 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
11dd0 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
11de0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
11df0 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
11e00 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
11e10 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
11e20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
11e30 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
11e40 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
11e50 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
11e60 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
11e70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
11e80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e90 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
11ea0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
11eb0 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
11ec0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
11ed0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
11ee0 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
11ef0 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
11f00 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
11f10 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
11f20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
11f30 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
11f40 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
11f50 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
11f60 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
11f70 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
11f80 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
11f90 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
11fa0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11fb0 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
11fc0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
11fd0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
11fe0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
11ff0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12000 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12010 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12020 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12030 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12040 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12050 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12060 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12070 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12080 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12090 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
120a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
120b0 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
120c0 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
120d0 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
120e0 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
120f0 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12100 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12110 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12120 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  de..  */.  if( p
12130 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12140 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
12150 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
12160 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12180 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
12190 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
121a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
121b0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
121c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
121d0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
121e0 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  K;.  }..  pPager
121f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
12200 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
12210 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50  nalHdr = 0;.  pP
12220 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
12230 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
12240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12250 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
12260 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20  n IOERR or FULL 
12270 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69  error that requi
12280 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  res.** the pager
12290 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69   to transition i
122a0 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
122b0 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63  ate may ahve occ
122c0 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69  urred..** The fi
122d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
122e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
122f0 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
12300 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  , the second .**
12310 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
12320 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
12330 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
12340 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  API function. Th
12350 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75  e .** value retu
12360 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
12370 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
12380 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
12390 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
123a0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
123b0 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
123c0 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45  FULL, SQLITE_IOE
123d0 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  RR or one of the
123e0 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f  .** IOERR sub-co
123f0 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65  des, the pager e
12400 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20  nters the ERROR 
12410 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72  state and the er
12420 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73  ror code.** is s
12430 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65  tored in Pager.e
12440 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68  rrCode. While th
12450 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20  e pager remains 
12460 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
12470 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72  te,.** all major
12480 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
12490 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  e Pager will imm
124a0 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
124b0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a  Pager.errCode..*
124c0 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73  *.** The ERROR s
124d0 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74  tate indicates t
124e0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
124f0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12500 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
12510 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
12520 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
12530 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
12540 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
12550 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
12560 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12570 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
12580 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
12590 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
125a0 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
125b0 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
125c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
125d0 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
125e0 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
125f0 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
12600 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
12610 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
12620 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
12630 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
12640 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
12650 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
12660 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
12670 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
12680 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
12690 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
126a0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
126b0 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
126c0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
126d0 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
126e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
126f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
12700 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
12710 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
12720 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
12730 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
12740 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
12750 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
12760 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12770 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
12780 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12790 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  AGER_ERROR;.  }.
127a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
127b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
127c0 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
127d0 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63  ction. A transac
127e0 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20  tion is usually 
127f0 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74  ended by .** eit
12800 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  her a COMMIT or 
12810 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61  a ROLLBACK opera
12820 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  tion. This routi
12830 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ne may be called
12840 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62   .** after rollb
12850 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ack of a hot-jou
12860 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  rnal, or if an e
12870 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
12880 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65  e opening.** the
12890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
128a0 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72   writing the ver
128b0 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  y first journal-
128c0 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64  header of a.** d
128d0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
128e0 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ion..** .** This
128f0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
12900 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45  r called in PAGE
12910 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49  R_ERROR state. I
12920 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a  f it is called.*
12930 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20  * in PAGER_NONE 
12940 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  or PAGER_SHARED 
12950 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f  state and the lo
12960 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a  ck held is less.
12970 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61  ** exclusive tha
12980 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
12990 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  k, it is a no-op
129a0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
129b0 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
129c0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
129d0 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
129e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
129f0 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
12a00 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
12a10 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
12a20 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
12a30 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
12a40 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
12a50 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
12a60 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
12a70 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
12a80 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
12a90 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
12aa0 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
12ab0 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
12ac0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12ad0 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
12ae0 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
12af0 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
12b00 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
12b10 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
12b20 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
12b30 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
12b40 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
12b50 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
12b60 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
12b70 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
12b80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
12b90 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
12ba0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12bb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
12bc0 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
12bd0 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
12be0 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
12bf0 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
12c00 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12c10 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
12c20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
12c30 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
12c40 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
12c50 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12c60 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
12c70 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
12c80 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
12c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
12ca0 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
12cb0 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
12cc0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
12cd0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
12ce0 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
12cf0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
12d00 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
12d10 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
12d20 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
12d30 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
12d40 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
12d50 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
12d60 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
12d70 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
12d80 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
12d90 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12da0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
12db0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12dc0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12dd0 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
12de0 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
12df0 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
12e00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
12e10 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
12e20 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
12e30 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
12e40 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
12e50 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
12e60 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
12e70 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
12e80 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
12e90 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
12ea0 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
12eb0 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
12ec0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
12ed0 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65  alized, the page
12ee0 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52  r moves to PAGER
12ef0 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a  _READER state..*
12f00 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
12f10 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f  non-exclusive ro
12f20 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65  llback mode, the
12f30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
12f40 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61  e is .** downgra
12f50 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f  ded to a SHARED_
12f60 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  LOCK..**.** SQLI
12f70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
12f80 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
12f90 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
12fa0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a  r occurs during.
12fb0 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f  ** any of the IO
12fc0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66   operations to f
12fd0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
12fe0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f  nal file or unlo
12ff0 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
13000 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  se then the IO e
13010 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
13020 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
13030 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70  r. If the .** op
13040 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c  eration to final
13050 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
13060 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e  file fails, then
13070 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a   the code still.
13080 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f  ** tries to unlo
13090 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
130a0 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65  file if not in e
130b0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49  xclusive mode. I
130c0 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20  f the.** unlock 
130d0 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20  operation fails 
130e0 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68  as well, then th
130f0 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f  e first error co
13100 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f  de related.** to
13110 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
13120 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68   encountered (th
13130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  e journal finali
13140 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a  zation one) is.*
13150 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
13160 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13170 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
13180 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
13190 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20  nt hasMaster){. 
131a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
131b0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72  _OK;      /* Err
131c0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75  or code from jou
131d0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
131e0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
131f0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
13200 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72  E_OK;     /* Err
13210 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20  or code from db 
13220 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  file unlock oper
13230 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44  ation */..  /* D
13240 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65  o nothing if the
13250 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
13260 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
13270 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te transaction. 
13280 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20   ** or at least 
13290 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
132a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
132b0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ay be called whe
132c0 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  n there.  ** is 
132d0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
132e0 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20  tion active but 
132f0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
13300 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20  eater lock is.  
13310 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77  ** held under tw
13320 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
13330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
13340 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  After a successf
13350 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ul hot-journal r
13360 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63  ollback, it is c
13370 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
13380 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47       eState==PAG
13390 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63  ER_NONE and eLoc
133a0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
133b0 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  K..  **.  **   2
133c0 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f  . If a connectio
133d0 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d  n with locking_m
133e0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f  ode=exclusive ho
133f0 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
13400 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f  VE .  **      lo
13410 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63 6b  ck switches back
13420 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   to locking_mode
13430 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e  =normal and then
13440 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a   executes a.  **
13450 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73        read-trans
13460 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e  action, this fun
13470 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13480 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47  with eState==PAG
13490 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20  ER_READER .  ** 
134a0 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d       and eLock==
134b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77  EXCLUSIVE_LOCK w
134c0 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61  hen the read-tra
134d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
134e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
134f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
13500 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
13510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13520 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
13530 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20  _ERROR );.  if( 
13540 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
13550 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
13560 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  ED && pPager->eL
13570 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43  ock<RESERVED_LOC
13580 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
13590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
135a0 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
135b0 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
135c0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
135d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
135e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
135f0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
13600 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13610 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
13620 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
13630 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
13640 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
13650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
13660 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13670 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
13680 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
136a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
136b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
136c0 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20  E_MEMORY );.    
136d0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
136e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
136f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13700 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13710 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13720 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
13730 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
13740 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
13750 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13780 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
13790 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
137a0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
137b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
137c0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
137d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
137e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
137f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13800 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
13810 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
13820 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
13830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13840 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
13850 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
13860 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
13870 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
13880 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
13890 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
138a0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
138b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
138c0 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
138d0 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
138e0 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
138f0 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
13900 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
13910 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
13920 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
13930 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
13940 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
13950 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
13960 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
13970 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
13980 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
13990 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
139a0 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
139b0 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
139c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
139d0 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  al. .      */.  
139e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
139f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13a00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13a10 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13a20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13a30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13a40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13a50 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13a60 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13a70 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13a80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13a90 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13aa0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13ab0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13ac0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
13ad0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
13ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13af0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13b00 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
13b10 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
13b20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
13b40 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
13b50 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
13b60 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
13b70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
13b80 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
13b90 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
13ba0 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
13bb0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
13bc0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
13bd0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
13be0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
13bf0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
13c00 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
13c10 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
13c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
13c30 65 72 55 6e 72 65 66 28 70 29 3b 0a 20 20 20 20  erUnref(p);.    
13c40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13c50 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
13c60 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
13c70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
13c80 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
13c90 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
13ca0 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ec = 0;.  sqlite
13cb0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
13cc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13cd0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13ce0 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
13cf0 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
13d00 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69  r->dbSize);..  i
13d10 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
13d20 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
13d30 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72   Drop the WAL wr
13d40 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79  ite-lock, if any
13d50 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63  . Also, if the c
13d60 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e  onnection was in
13d70 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   .    ** locking
13d80 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13d90 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c  mode but is no l
13da0 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20  onger, drop the 
13db0 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a  EXCLUSIVE .    *
13dc0 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  * lock held on t
13dd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13de0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32  ..    */.    rc2
13df0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64   = sqlite3WalEnd
13e00 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
13e10 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
13e20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32 3d      assert( rc2=
13e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13e40 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
13e50 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
13e60 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
13e70 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
13e80 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
13e90 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
13ea0 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
13eb0 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
13ec0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
13ed0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
13ee0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13ef0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
13f00 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
13f10 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
13f20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
13f30 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
13f40 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
13f50 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
13f60 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
13f70 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
13f80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
13f90 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
13fa0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
13fb0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
13fc0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
13fd0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
13fe0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
13ff0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
14000 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
14010 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
14020 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
14030 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
14040 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
14050 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
14060 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
14070 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
14080 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
14090 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
140a0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
140b0 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
140c0 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
140d0 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
140e0 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
140f0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
14100 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
14110 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
14120 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
14130 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
14140 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
14150 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
14160 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
14170 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14180 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
14190 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
141a0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
141b0 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
141c0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
141d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
141e0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
141f0 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
14200 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
14210 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14220 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
14230 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
14240 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
14250 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14260 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
14270 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
14280 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
14290 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
142a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
142b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
142c0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
142d0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
142e0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
142f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
14300 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14310 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
14320 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14330 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
14340 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14350 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14360 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14370 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14380 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
143a0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
143b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
143c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
143d0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
143e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
143f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14400 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14410 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14420 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
14430 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
14440 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
14450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
14460 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
14470 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14480 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
14490 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
144a0 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
144b0 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
144c0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
144d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
144e0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
144f0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
14500 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
14510 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
14520 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
14530 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
14540 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
14550 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
14560 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
14570 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
14580 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
14590 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
145a0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
145b0 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
145c0 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
145d0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
145e0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
145f0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
14600 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
14610 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
14620 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
14630 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
14640 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
14650 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
14660 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
14670 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
14680 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
14690 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
146a0 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
146b0 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
146c0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
146d0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
146e0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
146f0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
14700 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
14710 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
14720 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
14730 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
14740 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
14750 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
14760 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
14770 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
14780 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
14790 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
147a0 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
147b0 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
147c0 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
147d0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
147e0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
147f0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
14800 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
14810 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
14820 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
14830 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
14840 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
14850 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
14860 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
14870 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
14880 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
14890 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
148a0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
148b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
148c0 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
148d0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
148e0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
148f0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
14900 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
14910 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
14920 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
14930 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
14940 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
14950 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
14960 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
14970 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
14980 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
14990 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
149a0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
149b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
149c0 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
149d0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
149e0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
149f0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
14a00 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
14a30 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
14a40 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
14a50 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
14a60 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
14a70 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
14a80 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
14a90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
14aa0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
14ab0 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
14ac0 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
14ad0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
14ae0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
14af0 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
14b00 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
14b10 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
14b20 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
14b30 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
14b40 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
14b50 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
14b60 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
14b70 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
14b80 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
14b90 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
14ba0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
14bb0 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
14bc0 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
14bd0 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
14be0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
14bf0 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
14c00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14c10 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
14c20 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
14c30 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
14c40 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
14c50 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
14c60 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
14c70 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
14c80 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
14c90 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
14ca0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
14cb0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
14cc0 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
14cd0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
14ce0 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
14cf0 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
14d00 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
14d10 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
14d20 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
14d30 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
14d40 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
14d50 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
14d60 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
14d70 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
14d80 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
14d90 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
14da0 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
14db0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
14dc0 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
14dd0 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
14de0 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
14df0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
14e00 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
14e10 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
14e20 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
14e30 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
14e40 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
14e50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14e60 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
14e70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
14e80 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
14e90 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
14ea0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14eb0 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
14ec0 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
14ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
14ee0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
14ef0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
14f00 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
14f10 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
14f20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
14f30 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
14f40 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
14f50 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
14f60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
14f70 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
14f80 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
14f90 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
14fa0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
14fb0 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
14fc0 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
14fd0 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
14fe0 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
14ff0 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
15000 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
15010 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
15020 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
15030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15040 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
15050 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
15060 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
15070 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
15080 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
15090 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
150a0 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
150b0 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
150c0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
150d0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
150e0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
150f0 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
15100 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
15110 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
15120 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
15130 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
15140 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
15150 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
15160 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
15170 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
15180 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15190 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
151a0 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
151b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
151c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
151d0 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
151e0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
151f0 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15210 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
15220 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
15230 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
15260 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
15270 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
15280 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
15290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
152a0 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
152b0 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
152c0 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
152d0 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
152e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
152f0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15300 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
15310 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
15320 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
15330 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
15340 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
15350 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
15360 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
15370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15380 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
15390 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
153a0 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
153b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
153c0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
153d0 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
153e0 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
153f0 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15410 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
15420 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
15430 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
15440 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
15450 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
15460 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
15470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
15480 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
154b0 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
154c0 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
154d0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
154e0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
154f0 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
15500 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
15510 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
15520 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
15530 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
15540 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
15550 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
15560 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
15570 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
15580 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
15590 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
155a0 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
155b0 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
155c0 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
155d0 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
155e0 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
155f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
15600 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
15610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
15620 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
15630 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
15640 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
15650 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
15660 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
15670 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
15680 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
15690 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
156a0 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
156b0 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
156c0 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
156d0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
156e0 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
156f0 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
15700 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
15710 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
15720 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
15730 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
15740 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
15750 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
15760 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
15770 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
15780 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
15790 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
157a0 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
157b0 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
157c0 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
157d0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
157e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
157f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15800 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15810 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15820 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
15830 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
15840 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
15850 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
15860 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
15870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
15880 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
15890 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
158a0 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
158b0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
158c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
158d0 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
158e0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
158f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
15900 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
15910 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
15920 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
15930 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
15940 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
15950 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
15960 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
15970 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
15980 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
15990 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
159a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
159b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
159c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
159d0 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
159e0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
159f0 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
15a00 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
15a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
15a30 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
15a40 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
15a50 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
15a60 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
15a70 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
15a80 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
15a90 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
15aa0 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
15ab0 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
15ac0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
15ad0 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
15ae0 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
15af0 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
15b00 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
15b10 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
15b20 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
15b30 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
15b40 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
15b50 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
15b60 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
15b70 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
15b80 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
15b90 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
15ba0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
15bb0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
15bc0 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
15bd0 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
15be0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
15bf0 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
15c00 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
15c10 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
15c20 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
15c30 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
15c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15c50 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
15c60 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
15c70 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
15c80 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
15c90 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
15ca0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
15cb0 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
15cc0 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
15cd0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
15ce0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
15cf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15d00 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
15d10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
15d20 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
15d30 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79  y been played by
15d40 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
15d50 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
15d60 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
15d70 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
15d80 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
15d90 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
15da0 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
15db0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
15dc0 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
15dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15de0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
15df0 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
15e00 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
15e10 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
15e20 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
15e30 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
15e40 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15e50 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
15e60 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
15e70 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
15e80 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
15e90 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
15ea0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
15eb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
15ec0 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
15ed0 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
15ee0 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
15ef0 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
15f00 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
15f10 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
15f20 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
15f30 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
15f40 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
15f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
15f60 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
15f70 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
15f80 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
15f90 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
15fa0 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
15fb0 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
15fc0 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
15fd0 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
15fe0 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
15ff0 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
16000 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
16010 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
16020 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
16030 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
16040 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
16050 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
16060 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
16070 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
16080 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
16090 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
160a0 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
160b0 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
160c0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
160d0 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
160e0 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
160f0 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
16100 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
16110 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
16120 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
16130 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
16140 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
16150 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
16160 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
16170 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
16180 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
16190 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
161a0 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
161b0 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
161c0 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
161d0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
161e0 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
161f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16200 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
16210 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
16220 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
16230 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
16240 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
16250 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
16260 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
16270 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
16280 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
16290 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
162a0 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
162b0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
162c0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
162d0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
162e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
162f0 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
16300 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
16310 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
16320 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
16330 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
16340 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
16350 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
16360 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
16370 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
16380 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
16390 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
163a0 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
163b0 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
163c0 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
163d0 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
163e0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
163f0 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
16400 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
16410 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
16420 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
16430 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
16440 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
16450 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
16460 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
16470 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
16480 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
16490 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
164a0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
164b0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
164c0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
164d0 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
164e0 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
164f0 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
16500 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
16510 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
16520 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
16530 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
16540 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
16550 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
16560 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
16570 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
16580 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
16590 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
165a0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
165b0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
165c0 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
165d0 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
165e0 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
165f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
16600 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
16610 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
16620 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
16630 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
16640 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
16650 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
16660 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
16670 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
16680 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
16690 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
166a0 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
166b0 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
166c0 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
166d0 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
166e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
166f0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
16700 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
16710 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
16720 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
16730 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
16740 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
16750 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
16760 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
16770 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20   || pPg==0 );.  
16780 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
16790 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
167a0 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
167b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
167c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
167d0 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
167e0 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
167f0 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
16800 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
16810 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
16820 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
16830 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
16840 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
16850 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
16860 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
16870 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
16880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
16890 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
168a0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
168b0 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
168c0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
168d0 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
168e0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
168f0 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
16900 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16910 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
16920 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
16930 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
16940 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
16950 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
16960 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
16970 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
16980 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
16990 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
169a0 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
169b0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
169c0 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
169d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
169e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
169f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
16a00 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
16a10 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  ->fd, (u8*)aData
16a20 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16a30 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
16a40 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
16a50 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
16a60 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
16a70 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
16a80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16a90 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
16aa0 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
16ab0 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
16ac0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
16ad0 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
16ae0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
16af0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
16b00 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
16b10 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
16b20 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
16b30 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
16b40 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
16b50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
16b60 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
16b70 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
16b80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16b90 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
16ba0 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
16bb0 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
16bc0 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
16bd0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
16be0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
16bf0 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
16c00 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
16c10 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
16c20 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
16c30 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
16c40 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
16c50 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
16c60 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
16c70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
16c80 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
16c90 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
16ca0 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
16cb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
16cc0 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
16cd0 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
16ce0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
16cf0 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
16d00 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
16d10 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
16d20 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
16d30 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
16d40 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
16d50 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
16d60 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
16d70 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
16d80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
16d90 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
16da0 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
16db0 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
16dc0 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
16dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
16de0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
16df0 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
16e00 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
16e10 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
16e20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
16e30 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
16e40 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
16e50 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
16e60 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
16e70 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
16e80 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
16e90 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
16ea0 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
16eb0 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
16ec0 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
16ed0 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
16ee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
16ef0 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
16f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
16f10 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
16f20 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
16f30 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b  r->doNotSpill++;
16f40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16f50 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50  3PagerAcquire(pP
16f60 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
16f70 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
16f80 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
16f90 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70  pill==1 );.    p
16fa0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
16fb0 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21  l--;.    if( rc!
16fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16fd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d  urn rc;.    pPg-
16fe0 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
16ff0 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
17000 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
17010 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
17020 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
17030 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
17040 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
17050 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
17060 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
17070 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
17080 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
17090 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
170a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
170b0 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
170c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
170d0 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
170e0 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
170f0 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
17100 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
17110 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
17120 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
17130 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
17140 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
17150 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
17160 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
17170 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
17180 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
17190 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
171a0 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
171b0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
171c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
171d0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
171e0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69  (pPg);.    if( i
171f0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
17200 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
17210 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
17220 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
17230 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
17240 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
17250 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
17260 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
17270 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
17280 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
17290 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
172a0 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
172b0 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
172c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
172d0 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
172e0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
172f0 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
17300 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
17310 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
17320 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
17330 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
17340 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  out to the.     
17350 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
17360 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17370 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
17380 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  eption to this r
17390 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ule. If the page
173a0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
173b0 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61  .      ** back a
173c0 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65  s part of a save
173d0 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d  point (or statem
173e0 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72  ent) rollback fr
173f0 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  om an .      ** 
17400 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
17410 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
17420 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
17430 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20  it is not safe. 
17440 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20       ** to mark 
17450 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
17460 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  n. This is becau
17470 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70  se marking the p
17480 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  age as.      ** 
17490 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72  clean will clear
174a0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
174b0 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65  SYNC flag. Since
174c0 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20   the page is.   
174d0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e     ** already in
174e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
174f0 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50  e (recorded in P
17500 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ager.pInJournal)
17510 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
17520 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17530 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65  C flag is cleare
17540 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  d, if the page i
17550 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  s written to.   
17560 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
17570 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
17580 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
17590 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
175a0 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  but.      ** the
175b0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
175c0 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62   flag will not b
175d0 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20  e set. It could 
175e0 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79  then potentially
175f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69  .      ** be wri
17600 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68  tten out into th
17610 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17620 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e  before its journ
17630 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  al file.      **
17640 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63   segment is sync
17650 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f  ed. If a crash o
17660 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20  ccurs during or 
17670 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a  following this,.
17680 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
17690 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  e corruption may
176a0 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f   ensue..      */
176b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
176c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
176d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  er) );.      sql
176e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
176f0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
17700 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
17710 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20  gehash(pPg);..  
17720 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
17730 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
17740 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
17750 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
17760 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
17770 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
17780 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
17790 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
177a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
177b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
177c0 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
177d0 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
177e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
177f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
17800 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
17810 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
17820 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
17830 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
17840 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
17850 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
17860 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17870 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
17880 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17890 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
178a0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
178b0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
178c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
178d0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
178e0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
178f0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
17900 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17910 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
17920 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
17930 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
17940 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
17950 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
17960 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17970 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
17980 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
17990 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
179a0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
179b0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
179c0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
179d0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
179e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
179f0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
17a00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
17a10 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
17a20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
17a30 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
17a40 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
17a50 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
17a60 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
17a70 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
17a80 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
17a90 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
17aa0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
17ab0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
17ac0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
17ad0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
17ae0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
17af0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
17b00 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
17b10 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
17b20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
17b30 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
17b40 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
17b50 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
17b60 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
17b70 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
17b80 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
17b90 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
17ba0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
17bb0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
17bc0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
17bd0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
17be0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
17bf0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
17c00 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
17c10 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
17c20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
17c30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
17c40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
17c50 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
17c60 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
17c70 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
17c80 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
17c90 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
17ca0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
17cb0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
17cc0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
17cd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
17ce0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
17cf0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
17d00 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17d10 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
17d20 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
17d30 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
17d40 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
17d50 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
17d60 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
17d70 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
17d80 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
17d90 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
17da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
17db0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
17dc0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
17dd0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
17de0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
17df0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
17e00 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
17e10 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
17e20 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
17e30 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
17e40 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
17e50 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
17e60 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
17e70 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
17e80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
17e90 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
17ea0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
17eb0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
17ec0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
17ed0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
17ee0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
17ef0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
17f00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
17f10 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
17f20 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
17f30 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
17f40 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
17f50 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
17f60 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
17f70 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
17f80 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
17f90 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
17fa0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
17fb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17fc0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
17fd0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
17fe0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
17ff0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
18000 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
18010 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
18020 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18030 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
18040 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
18050 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
18060 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
18070 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
18080 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
180b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
180c0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
180d0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
180e0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
180f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
18100 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
18110 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
18120 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
18130 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18140 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
18150 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
18160 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
18170 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18180 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
18190 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
181a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
181b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
181c0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
181d0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
181e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
181f0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
18200 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
18210 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
18220 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
18230 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
18240 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
18250 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18260 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
18270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
18280 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
18290 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
182a0 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
182b0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
182c0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
182d0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
182e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
182f0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
18300 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
18310 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18320 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
18330 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
18340 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
18350 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
18360 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
18370 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
18380 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
18390 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
183a0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
183b0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
183c0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
183d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
183e0 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
183f0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
18400 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  = .#if SQLITE_EN
18410 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
18420 54 49 4f 4e 0a 20 20 20 20 20 20 28 70 50 61 67  TION.      (pPag
18430 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c  er->vfsFlags&SQL
18440 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f  ITE_OPEN_FILEPRO
18450 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23  TECTION_MASK)|.#
18460 65 6e 64 69 66 0a 20 20 20 20 20 20 28 53 51 4c  endif.      (SQL
18470 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18480 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
18490 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
184a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
184b0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
184c0 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
184d0 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
184e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
184f0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
18500 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  r_out;..  /* Loa
18510 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
18520 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18530 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
18540 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73  ined from.  ** s
18550 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
18560 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
18570 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
18580 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a  .   Also obtain.
18590 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20    ** sufficient 
185a0 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65  space (in zMaste
185b0 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68  rPtr) to hold th
185c0 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65  e names of maste
185d0 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  r.  ** journal f
185e0 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66  iles extracted f
185f0 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c  rom regular roll
18600 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20  back-journals.. 
18610 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18620 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
18630 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
18640 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
18650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18660 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18670 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  ;.  nMasterPtr =
18680 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
18690 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  e+1;.  zMasterJo
186a0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
186b0 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74  alloc((int)nMast
186c0 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
186d0 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
186e0 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
186f0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
18700 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18710 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18720 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
18730 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
18740 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
18750 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  rc 
18760 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
18770 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
18780 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
18790 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
187a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
187b0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
187c0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d  master_out;.  zM
187d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
187e0 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
187f0 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
18800 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
18810 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
18820 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
18830 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
18840 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
18850 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
18860 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
18870 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
18880 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
18890 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
188a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
188b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
188c0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
188d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
188e0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
188f0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
18900 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
18910 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
18920 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
18930 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
18940 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
18950 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
18960 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
18970 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
18980 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
18990 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
189a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
189b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
189c0 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
189d0 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51 4c 49  lags = .#if SQLI
189e0 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
189f0 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20  ROTECTION.      
18a00 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
18a10 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
18a20 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
18a30 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
18a40 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
18a50 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
18a60 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
18a70 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  NAL);.      rc =
18a80 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
18a90 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
18aa0 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
18ab0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
18ac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18ad0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
18ae0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
18af0 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72   }..      rc = r
18b00 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
18b10 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
18b20 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
18b30 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
18b40 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
18b50 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
18b60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18b70 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
18b80 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
18b90 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d   }..      c = zM
18ba0 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
18bb0 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
18bc0 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
18bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b  ;.      if( c ){
18be0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68  .        /* We h
18bf0 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
18c00 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
18c10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18c20 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  le. */.        g
18c30 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18c40 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
18c50 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d  .    zJournal +=
18c60 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
18c70 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
18c80 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f    }. .  sqlite3O
18c90 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
18ca0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
18cb0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
18cc0 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
18cd0 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  aster_out:.  sql
18ce0 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
18cf0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
18d00 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
18d10 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18d20 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
18d30 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
18d40 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71  urnal) );.    sq
18d50 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
18d60 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
18d70 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
18d80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
18d90 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
18da0 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
18db0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18dc0 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
18dd0 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
18de0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
18df0 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
18e00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
18e10 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
18e20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
18e30 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
18e40 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
18e50 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
18e60 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
18e70 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
18e80 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72  en, or the pager
18e90 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65   is not in eithe
18ea0 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50  r.** DBMOD or OP
18eb0 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  EN state, this f
18ec0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
18ed0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
18ee0 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74  he size .** of t
18ef0 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67  he file is chang
18f00 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ed to nPage page
18f10 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d  s (nPage*pPager-
18f20 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29  >pageSize bytes)
18f30 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  . .** If the fil
18f40 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  e on disk is cur
18f50 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
18f60 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
18f70 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
18f80 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
18f90 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
18fa0 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
18fb0 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   it might might 
18fc0 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
18fd0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
18fe0 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
18ff0 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
19000 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
19010 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
19020 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
19030 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
19040 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
19050 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
19060 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
19070 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
19080 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
19090 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
190a0 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
190b0 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
190c0 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
190d0 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
190e0 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
190f0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19110 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
19120 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
19130 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
19140 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
19150 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
19160 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
19170 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
19180 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
19190 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
191a0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
191b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
191c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
191d0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
191e0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
191f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
19200 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45  ate!=PAGER_READE
19210 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73  R );.  .  if( is
19220 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
19230 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d   .   && (pPager-
19240 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
19250 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
19260 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
19270 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b  AGER_OPEN) .  ){
19280 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
19290 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
192a0 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20     int szPage = 
192b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
192c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
192d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
192e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
192f0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
19300 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
19310 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
19320 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
19330 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
19340 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
19350 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
19360 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61    newSize = szPa
19370 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ge*(i64)nPage;. 
19380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19390 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
193a0 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
193b0 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
193c0 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
193d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
193e0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
193f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
19400 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
19410 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  e{.        char 
19420 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e  *pTmp = pPager->
19430 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20  pTmpSpace;.     
19440 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20     memset(pTmp, 
19450 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  0, szPage);.    
19460 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
19470 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3c  ewSize-szPage) <
19480 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b    currentSize );
19490 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
194a0 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
194b0 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
194c0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
194d0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
194e0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
194f0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
19500 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19510 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
19520 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
19530 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
19540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19550 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19560 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
19570 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
19580 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
19590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
195a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
195b0 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
195c0 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
195d0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
195e0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
195f0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
19600 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
19610 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
19620 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
19630 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
19640 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
19650 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
19660 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
19670 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
19680 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
19690 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
196a0 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
196b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
196c0 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
196d0 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
196e0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
196f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
19700 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19710 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
19720 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
19730 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
19740 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
19750 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
19760 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
19770 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
19780 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
19790 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
197a0 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
197b0 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
197c0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
197d0 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
197e0 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
197f0 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
19800 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
19810 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
19820 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
19830 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
19840 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
19850 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
19860 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
19870 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
19880 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
19890 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
198a0 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
198b0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
198c0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
198d0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
198e0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
198f0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
19900 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
19910 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
19920 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
19930 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
19940 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
19950 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
19960 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
19970 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
19980 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
19990 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
199a0 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
199b0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
199c0 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
199d0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
199e0 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
199f0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
19a00 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19a10 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
19a20 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
19a30 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
19a40 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
19a50 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
19a60 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
19a70 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
19a80 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
19a90 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
19aa0 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
19ab0 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
19ac0 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
19ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
19ae0 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
19af0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
19b00 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
19b10 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
19b20 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
19b30 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
19b40 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19b50 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
19b60 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
19b70 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
19b80 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
19b90 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
19ba0 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
19bb0 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
19bc0 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
19bd0 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
19be0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
19bf0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
19c00 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
19c10 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
19c20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
19c30 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
19c40 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
19c50 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
19c60 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
19c70 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
19c80 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
19c90 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
19ca0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
19cb0 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
19cc0 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
19cd0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
19ce0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19cf0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
19d00 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
19d10 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
19d20 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
19d30 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
19d40 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19d50 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19d60 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
19d70 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
19d80 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
19d90 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
19da0 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
19db0 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
19dc0 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
19dd0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
19de0 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
19df0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
19e00 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
19e10 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
19e20 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
19e30 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
19e40 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
19e50 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
19e60 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
19e70 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
19e80 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
19e90 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
19ea0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
19eb0 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
19ec0 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
19ed0 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
19ee0 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
19ef0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
19f00 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
19f10 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
19f20 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
19f30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
19f40 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
19f50 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
19f60 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
19f70 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
19f80 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
19f90 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
19fa0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
19fb0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
19fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
19fd0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
19fe0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
19ff0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
1a000 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1a010 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
1a020 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
1a030 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
1a040 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
1a050 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
1a060 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
1a070 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
1a080 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
1a090 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
1a0a0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1a0b0 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
1a0c0 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
1a0d0 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
1a0e0 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
1a0f0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
1a100 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
1a110 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1a120 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
1a130 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
1a140 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1a150 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
1a160 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
1a170 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
1a180 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
1a190 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
1a1a0 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
1a1b0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
1a1c0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
1a1d0 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
1a1e0 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
1a1f0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
1a200 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
1a210 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
1a220 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
1a230 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
1a240 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
1a250 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
1a260 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
1a270 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1a280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a290 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1a2a0 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1a2b0 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1a2c0 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1a2d0 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1a2e0 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1a2f0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1a300 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1a310 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1a320 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1a330 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1a340 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1a350 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1a360 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1a370 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1a380 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1a390 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1a3a0 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1a3b0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1a3c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1a3d0 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1a3e0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1a3f0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a400 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1a410 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1a420 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1a430 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1a440 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1a450 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1a460 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1a470 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1a480 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1a490 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1a4a0 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1a4b0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1a4c0 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1a4d0 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1a4e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1a4f0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1a500 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1a510 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1a520 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1a530 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1a540 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1a550 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1a560 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1a570 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a580 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1a590 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1a5a0 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1a5b0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1a5c0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1a5d0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1a5e0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a5f0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a600 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1a610 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1a620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a630 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1a640 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1a650 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a670 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1a680 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1a690 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1a6a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1a6b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1a6c0 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1a6d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1a6e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1a6f0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1a700 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1a710 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1a720 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1a730 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1a740 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1a750 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1a760 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1a770 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1a780 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1a790 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1a7a0 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1a7b0 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1a7c0 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1a7d0 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1a7e0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
1a7f0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
1a800 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
1a810 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
1a820 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
1a830 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
1a840 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
1a850 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1a860 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
1a870 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a880 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
1a890 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
1a8a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a8b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1a8c0 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
1a8d0 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
1a8e0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
1a8f0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
1a900 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
1a910 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
1a920 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1a930 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
1a940 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
1a950 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
1a960 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
1a970 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1a980 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
1a990 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
1a9a0 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
1a9b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1a9c0 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
1a9d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
1a9e0 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
1a9f0 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
1aa00 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
1aa10 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
1aa20 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
1aa30 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
1aa40 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
1aa50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1aa60 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
1aa70 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
1aa80 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
1aa90 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
1aaa0 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1aab0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1aac0 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1aad0 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1aae0 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1aaf0 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1ab00 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1ab10 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1ab20 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1ab30 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1ab40 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1ab50 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1ab60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ab70 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1ab80 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ab90 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1aba0 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1abb0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1abc0 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1abd0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1abe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1abf0 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1ac00 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1ac10 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1ac20 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1ac30 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1ac40 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1ac50 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1ac60 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1ac70 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1ac80 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1ac90 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1aca0 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1acb0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1acc0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1acd0 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1ace0 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1acf0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1ad00 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1ad10 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1ad20 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1ad30 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1ad40 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1ad50 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1ad60 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1ad70 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1ad80 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1ad90 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1ada0 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1adb0 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1adc0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1add0 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1ade0 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1adf0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1ae00 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1ae10 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1ae20 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1ae30 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1ae40 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1ae50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ae60 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1ae70 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1ae80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ae90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1aea0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1aeb0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1aec0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1aed0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1aee0 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1aef0 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1af00 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1af10 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1af20 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1af30 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1af40 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1af50 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1af60 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1af70 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1af80 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1af90 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1afa0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1afb0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1afc0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1afd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1afe0 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1aff0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b000 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1b010 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1b020 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1b030 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1b040 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1b050 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1b060 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1b070 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1b080 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1b090 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1b0a0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1b0b0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1b0c0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1b0d0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1b0e0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1b0f0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1b100 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1b110 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1b120 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1b130 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1b140 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1b150 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1b160 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1b170 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1b180 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1b190 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1b1a0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1b1b0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1b1c0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1b1d0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1b1e0 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1b1f0 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1b200 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1b210 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1b220 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1b230 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1b240 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1b250 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1b260 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1b270 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1b280 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1b290 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1b2a0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1b2b0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1b2c0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1b2d0 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1b2e0 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1b2f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1b300 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b310 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1b320 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1b330 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1b340 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1b350 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1b360 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1b370 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1b380 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1b390 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1b3a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1b3b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b3c0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1b3d0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1b3e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1b3f0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1b400 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1b410 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1b420 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1b430 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1b440 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1b450 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1b460 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1b470 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1b480 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1b490 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1b4a0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1b4b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1b4c0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1b4d0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1b4e0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1b4f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1b500 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1b510 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1b520 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1b530 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1b540 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1b550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1b570 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1b580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b590 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b5a0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1b5b0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1b5c0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1b5d0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1b5e0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1b5f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1b600 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1b610 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1b620 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1b630 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1b640 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1b650 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1b660 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1b670 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1b680 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1b690 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1b6a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1b6b0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1b6c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b6d0 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1b6e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b6f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
1b700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1b710 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
1b720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b730 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b740 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1b750 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1b760 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1b770 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1b780 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1b790 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1b7a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1b7b0 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1b7c0 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1b7d0 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1b7e0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1b7f0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1b800 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1b810 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1b820 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1b830 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1b840 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1b850 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1b860 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1b870 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1b880 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1b890 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1b8a0 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1b8b0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1b8c0 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1b8d0 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1b8e0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1b8f0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1b900 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1b910 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1b920 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1b930 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1b940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1b950 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1b960 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1b970 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1b980 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1b990 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1b9a0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1b9b0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1b9c0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1b9d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1b9e0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1b9f0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1ba00 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1ba10 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1ba20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1ba30 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1ba40 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1ba50 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1ba60 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1ba70 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1ba80 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1ba90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1baa0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1bab0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1bac0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1bad0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1bae0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1baf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1bb00 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1bb10 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1bb20 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1bb30 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1bb40 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1bb50 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1bb60 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1bb70 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1bb80 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1bb90 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1bba0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1bbb0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1bbc0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1bbd0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1bbe0 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
1bbf0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1bc00 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
1bc10 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1bc20 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
1bc30 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1bc40 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
1bc50 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
1bc60 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
1bc70 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
1bc80 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
1bc90 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
1bca0 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
1bcb0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
1bcc0 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
1bcd0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1bce0 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
1bcf0 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
1bd00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1bd10 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
1bd20 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1bd30 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
1bd40 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
1bd50 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
1bd60 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
1bd70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
1bd80 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
1bd90 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
1bda0 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
1bdb0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
1bdc0 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
1bdd0 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
1bde0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1bdf0 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
1be00 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
1be10 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
1be20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
1be30 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
1be40 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1be50 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
1be60 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
1be70 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
1be80 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
1be90 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1bea0 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
1beb0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1bec0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
1bed0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
1bee0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bef0 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
1bf00 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1bf10 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
1bf20 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1bf30 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1bf40 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1bf50 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1bf60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1bf70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1bf80 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1bf90 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70  LITE_OK.   && (p
1bfa0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1bfb0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1bfc0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1bfd0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1bfe0 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
1bff0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
1c000 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
1c010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c020 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1c030 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1c040 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
1c050 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20  er[0]!='\0');.  
1c060 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1c070 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1c080 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c090 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1c0a0 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
1c0b0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
1c0c0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1c0d0 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
1c0e0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
1c0f0 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
1c100 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
1c110 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
1c120 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1c130 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
1c140 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
1c150 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
1c160 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
1c170 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1c180 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
1c190 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1c1a0 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1c1b0 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1c1c0 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1c1d0 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1c1e0 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1c1f0 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1c200 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1c210 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1c220 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1c230 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1c240 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1c250 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1c260 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1c270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c280 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1c290 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1c2a0 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1c2b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1c2c0 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1c2d0 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1c2e0 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1c2f0 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1c300 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1c310 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1c320 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c330 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1c340 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1c350 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1c360 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1c370 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1c380 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1c390 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1c3a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1c3b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1c3c0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1c3d0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1c3e0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1c3f0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1c400 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1c410 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1c420 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1c430 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1c440 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1c450 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1c460 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1c470 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1c480 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1c490 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1c4a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1c4b0 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1c4c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c4d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1c4e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1c4f0 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d  .  int isInWal =
1c500 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c510 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67 65 20  /* True if page 
1c520 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a  is in log file *
1c530 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  /.  int pgsz = p
1c540 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1c550 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1c560 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a  tes to read */..
1c570 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c580 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1c590 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42  READER && !MEMDB
1c5a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
1c5b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1c5c0 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1c5d0 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  (!isOpen(pPager-
1c5e0 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73  >fd)) ){.    ass
1c5f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
1c600 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d  pFile );.    mem
1c610 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
1c620 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
1c630 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ize);.    return
1c640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c650 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
1c660 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1c670 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c    /* Try to pull
1c680 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1c690 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  he write-ahead l
1c6a0 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
1c6b0 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70  sqlite3WalRead(p
1c6c0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
1c6d0 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73  o, &isInWal, pgs
1c6e0 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  z, pPg->pData);.
1c6f0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c700 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e  LITE_OK && !isIn
1c710 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69  Wal ){.    i64 i
1c720 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
1c730 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1c740 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1c750 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1c760 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1c770 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f  >pData, pgsz, iO
1c780 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
1c790 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1c7a0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1c7b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c7c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1c7d0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1c7e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1c7f0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1c800 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1c810 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1c820 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1c830 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1c840 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1c850 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1c860 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1c870 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1c880 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1c890 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1c8a0 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1c8b0 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1c8c0 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1c8d0 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1c8e0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1c8f0 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1c900 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1c910 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1c920 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1c930 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1c940 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1c950 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1c960 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1c970 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1c980 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1c990 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1c9a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1c9b0 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1c9c0 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1c9d0 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1c9e0 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1c9f0 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1ca00 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1ca10 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1ca20 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1ca30 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1ca40 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e   ** white noisin
1ca50 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79  g equaling 16 by
1ca60 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76  tes of 0xff is v
1ca70 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
1ca80 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20   so.      ** we 
1ca90 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20  should still be 
1caa0 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ok..      */.   
1cab0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72     memset(pPager
1cac0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78  ->dbFileVers, 0x
1cad0 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  ff, sizeof(pPage
1cae0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1caf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cb00 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
1cb10 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
1cb20 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20  Data)[24];.     
1cb30 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1cb40 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1cb50 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1cb60 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1cb70 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rs));.    }.  }.
1cb80 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1cb90 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e   pPg->pData, pgn
1cba0 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54  o, 3, rc = SQLIT
1cbb0 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47  E_NOMEM);..  PAG
1cbc0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1cbd0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1cbe0 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
1cbf0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
1cc00 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
1cc10 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
1cc20 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50  ger, pgno));.  P
1cc30 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43  AGERTRACE(("FETC
1cc40 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  H %d page %d has
1cc50 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1cc60 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1cc70 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1cc80 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1cc90 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75  (pPg)));..  retu
1cca0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ccb0 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65  Update the value
1ccc0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
1ccd0 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74  ounter at offset
1cce0 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a  s 24 and 92 in.*
1ccf0 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  * the header and
1cd00 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73   the sqlite vers
1cd10 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
1cd20 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54  fset 96..**.** T
1cd30 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64  his is an uncond
1cd40 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20  itional update. 
1cd50 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61   See also the pa
1cd60 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1cd70 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74  ounter().** rout
1cd80 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75  ine which only u
1cd90 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1cda0 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65  e-counter if the
1cdb0 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61   update is actua
1cdc0 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61  lly.** needed, a
1cdd0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1cde0 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
1cdf0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74  geCountDone stat
1ce00 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
1ce10 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1ce20 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1ce30 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29  nter(PgHdr *pPg)
1ce40 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  {.  u32 change_c
1ce50 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e  ounter;..  /* In
1ce60 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1ce70 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1ce80 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1ce90 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
1cea0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1ceb0 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
1cec0 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72  (u8*)pPg->pPager
1ced0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b  ->dbFileVers)+1;
1cee0 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1cef0 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1cf00 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1cf10 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ter);..  /* Also
1cf20 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
1cf30 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1cf40 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
1cf50 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74   and in.  ** byt
1cf60 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
1cf70 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1cf80 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1cf90 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
1cfa0 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a    ** is valid. *
1cfb0 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  /.  put32bits(((
1cfc0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1cfd0 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+92, change_cou
1cfe0 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69  nter);.  put32bi
1cff0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1d000 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
1d010 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
1d020 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1d030 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1d040 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d050 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  n is invoked onc
1d060 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  e for each page 
1d070 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1d080 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65   been .** writte
1d090 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66  n into the log f
1d0a0 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74  ile when a WAL t
1d0b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1d0c0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61  lled back..** Pa
1d0d0 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74  rameter iPg is t
1d0e0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1d0f0 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65  f said page. The
1d100 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a   pCtx argument .
1d110 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ** is actually a
1d120 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1d130 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
1d140 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69  .**.** If page i
1d150 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  Pg is present in
1d160 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20   the cache, and 
1d170 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1d180 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a  ng references,.*
1d190 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65  * it is discarde
1d1a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1d1b0 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
1d1c0 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
1d1d0 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ng.** references
1d1e0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1d1f0 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66  nt is reloaded f
1d200 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d210 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65  . If the.** atte
1d220 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f  mpt to reload co
1d230 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1d240 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69  atabase is requi
1d250 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a  red and fails, .
1d260 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1d270 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1d280 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1d290 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1d2a0 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  int pagerUndoCal
1d2b0 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78  lback(void *pCtx
1d2c0 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69  , Pgno iPg){.  i
1d2d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d2e0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1d2f0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43  er = (Pager *)pC
1d300 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  tx;.  PgHdr *pPg
1d310 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74  ;..  pPg = sqlit
1d320 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
1d330 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66  ager, iPg);.  if
1d340 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28  ( pPg ){.    if(
1d350 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1d360 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d  geRefcount(pPg)=
1d370 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
1d380 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
1d390 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1d3a0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
1d3b0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
1d3c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d3d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1d3e0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
1d3f0 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
1d400 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1d410 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1d420 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  }.  }..  /* Norm
1d430 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73  ally, if a trans
1d440 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1d450 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75   back, any backu
1d460 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a  p processes are.
1d470 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20    ** updated as 
1d480 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f  data is copied o
1d490 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ut of the rollba
1d4a0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ck journal and i
1d4b0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
1d4c0 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e  abase. This is n
1d4d0 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73  ot generally pos
1d4e0 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c  sible with a WAL
1d4f0 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20   database, as.  
1d500 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f  ** rollback invo
1d510 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e  lves simply trun
1d520 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66  cating the log f
1d530 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20  ile. Therefore, 
1d540 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d  if one.  ** or m
1d550 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20  ore frames have 
1d560 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1d570 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tten to the log 
1d580 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a  (and therefore .
1d590 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64    ** also copied
1d5a0 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70   into the backup
1d5b0 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70   databases) as p
1d5c0 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  art of this tran
1d5d0 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68  saction,.  ** th
1d5e0 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62  e backups must b
1d5f0 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a  e restarted..  *
1d600 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  /.  sqlite3Backu
1d610 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
1d620 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65  >pBackup);..  re
1d630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d640 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d650 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
1d660 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1d670 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74  ion on a WAL dat
1d680 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1d690 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61   int pagerRollba
1d6a0 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  ckWal(Pager *pPa
1d6b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1d6e0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64  n Code */.  PgHd
1d6f0 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  r *pList;       
1d700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1d710 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1d720 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a  es to revert */.
1d730 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61  .  /* For all pa
1d740 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1d750 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
1d760 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76  tly dirty or hav
1d770 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  e already.  ** b
1d780 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74  een written (but
1d790 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20   not committed) 
1d7a0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c  to the log file,
1d7b0 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a   do one of the .
1d7c0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a    ** following:.
1d7d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69    **.  **   + Di
1d7e0 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64  scard the cached
1d7f0 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75   page (if refcou
1d800 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  nt==0), or.  ** 
1d810 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20    + Reload page 
1d820 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1d830 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65   database (if re
1d840 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a  fcount>0)..  */.
1d850 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d860 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
1d870 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  gSize;.  rc = sq
1d880 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61  lite3WalUndo(pPa
1d890 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72  ger->pWal, pager
1d8a0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  UndoCallback, (v
1d8b0 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20  oid *)pPager);. 
1d8c0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1d8d0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1d8e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1d8f0 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
1d900 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1d910 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
1d920 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pNext = pList->p
1d930 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20  Dirty;.    rc = 
1d940 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1d950 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  k((void *)pPager
1d960 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
1d970 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
1d980 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
1d990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1d9a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1d9b0 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
1d9c0 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1d9d0 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c  (). As well as l
1d9e0 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ogging.** the co
1d9f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69  ntents of the li
1da00 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64  st of pages head
1da10 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e  ed by pList (con
1da20 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
1da30 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1da40 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79  ion notifies any
1da50 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70   active backup p
1da60 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68  rocesses that th
1da70 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20  e pages have.** 
1da80 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  changed. .**.** 
1da90 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  The list of page
1daa0 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  s passed into th
1dab0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c  is routine is al
1dac0 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70  ways sorted by p
1dad0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48  age number..** H
1dae0 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20  ence, if page 1 
1daf0 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65  appears anywhere
1db00 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74   on the list, it
1db10 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72   will be the fir
1db20 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61  st page..*/ .sta
1db30 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c  tic int pagerWal
1db40 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20  Frames(.  Pager 
1db50 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
1db60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1db70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
1db80 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20  gHdr *pList,    
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dba0 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73  * List of frames
1dbb0 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e   to log */.  Pgn
1dbc0 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  o nTruncate,    
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dbe0 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66  Database size af
1dbf0 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20  ter this commit 
1dc00 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1dc10 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1dc20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1dc30 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74  this is a commit
1dc40 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 46 6c   */.  int syncFl
1dc50 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
1dc60 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
1dc70 6f 20 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63  o pass to OsSync
1dc80 28 29 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a  () (or 0) */.){.
1dc90 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1dcc0 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1dcd0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
1dce0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1dcf0 43 48 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50  CHECK_PAGES).  P
1dd00 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dd20 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1dd30 65 72 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64  er pages */.#end
1dd40 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
1dd50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 23 69  ager->pWal );.#i
1dd60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1dd70 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
1dd80 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74  at the page list
1dd90 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67   is in accending
1dda0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28   order */.  for(
1ddb0 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d  p=pList; p && p-
1ddc0 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44  >pDirty; p=p->pD
1ddd0 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72  irty){.    asser
1dde0 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e  t( p->pgno < p->
1ddf0 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a  pDirty->pgno );.
1de00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
1de10 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1de20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1de30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1de40 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1de50 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1de60 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1de70 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1de80 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1de90 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1dea0 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1deb0 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1dec0 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1ded0 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1dee0 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1def0 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1df00 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1df10 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1df20 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64  Hdr *p;.    PgHd
1df30 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c  r **ppNext = &pL
1df40 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ist;.    for(p=p
1df50 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d  List; (*ppNext =
1df60 20 70 29 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79   p); p=p->pDirty
1df70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1df80 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20  pgno<=nTruncate 
1df90 29 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70  ) ppNext = &p->p
1dfa0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
1dfb0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1dfc0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69  ;.  }..  if( pLi
1dfd0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
1dfe0 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1dff0 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
1e000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e010 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e  lFrames(pPager->
1e020 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61  pWal, .      pPa
1e030 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
1e040 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c  List, nTruncate,
1e050 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 46   isCommit, syncF
1e060 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
1e070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e080 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
1e090 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1e0a0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ;.    for(p=pLis
1e0b0 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1e0c0 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1e0d0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1e0e0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1e0f0 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1e100 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1e110 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1e120 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1e130 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1e140 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1e150 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1e160 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1e170 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1e180 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
1e190 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a  agehash(p);.  }.
1e1a0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1e1b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
1e1c0 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  gin a read trans
1e1d0 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41  action on the WA
1e1e0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
1e1f0 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65  utine used to be
1e200 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70   called "pagerOp
1e210 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65  enSnapshot()" be
1e220 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69  cause it essenti
1e230 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20  ally.** makes a 
1e240 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20  snapshot of the 
1e250 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
1e260 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e  current point in
1e270 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72   time and preser
1e280 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70  ves.** that snap
1e290 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20  shot for use by 
1e2a0 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70  the reader in sp
1e2b0 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e  ite of concurren
1e2c0 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a  tly changes by.*
1e2d0 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20  * other writers 
1e2e0 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
1e2f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e300 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
1e310 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
1e320 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e330 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1e340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e350 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e360 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b  int changed = 0;
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
1e390 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a   must be reset *
1e3a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  /..  assert( pag
1e3b0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1e3c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e3d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1e3e0 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
1e3f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1e400 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f  R_READER );..  /
1e410 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52  * sqlite3WalEndR
1e420 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  eadTransaction()
1e430 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
1e440 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
1e450 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1e460 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  n in locking_mod
1e470 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f  e=EXCLUSIVE.  So
1e480 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49   call it now.  I
1e490 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e  f we.  ** are in
1e4a0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f   locking_mode=NO
1e4b0 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64  RMAL and EndRead
1e4c0 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  () was previousl
1e4d0 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74  y called,.  ** t
1e4e0 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c  he duplicate cal
1e4f0 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20  l is harmless.. 
1e500 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   */.  sqlite3Wal
1e510 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1e520 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
1e530 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1e540 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61  3WalBeginReadTra
1e550 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1e560 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
1e570 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1e580 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64  TE_OK || changed
1e590 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
1e5a0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
1e5b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1e5c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1e5d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e5e0 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
1e5f0 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  f the transition
1e600 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e   from PAGER_OPEN
1e610 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41  .** to PAGER_REA
1e620 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74  DER state to det
1e630 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1e640 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e650 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  file.** in pages
1e660 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70   (assuming the p
1e670 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74  age size current
1e680 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  ly stored in Pag
1e690 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a  er.pageSize)..**
1e6a0 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
1e6b0 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
1e6c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
1e6d0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
1e6e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
1e6f0 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64   pages is stored
1e700 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68   in *pnPage. Oth
1e710 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72  erwise, an error
1e720 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a   code (perhaps.*
1e730 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  * SQLITE_IOERR_F
1e740 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65  STAT) is returne
1e750 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  d and *pnPage is
1e760 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
1e770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e780 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  pagerPagecount(P
1e790 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1e7a0 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50  no *pnPage){.  P
1e7b0 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e7d0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1e7e0 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
1e7f0 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65  ..  /* Query the
1e800 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1e810 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
1e820 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62   size. The WalDb
1e830 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63  size().  ** func
1e840 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72  tion returns zer
1e850 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20  o if the WAL is 
1e860 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50  not open (i.e. P
1e870 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f  ager.pWal==0), o
1e880 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61  r.  ** if the da
1e890 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1e8a0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  ot available. Th
1e8b0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1e8c0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69  is not.  ** avai
1e8d0 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57  lable from the W
1e8e0 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66  AL sub-system if
1e8f0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73   the log file is
1e900 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63   empty or.  ** c
1e910 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64  ontains no valid
1e920 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73   committed trans
1e930 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  actions..  */.  
1e940 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e950 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1e960 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1e970 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1e980 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50  HARED_LOCK || pP
1e990 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
1e9a0 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
1e9b0 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1e9c0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1e9d0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
1e9e0 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74  ase size was not
1e9f0 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1ea00 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1ea10 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69  em,.  ** determi
1ea20 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74  ne it based on t
1ea30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1ea40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1ea50 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f   the size.  ** o
1ea60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1ea70 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ile is not an in
1ea80 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
1ea90 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
1eaa0 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e  .  ** round down
1eab0 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20   to the nearest 
1eac0 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e  page. Except, an
1ead0 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68  y file larger th
1eae0 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20  an 0.  ** bytes 
1eaf0 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69  in size is consi
1eb00 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dered to contain
1eb10 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61   at least one pa
1eb20 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ge..  */.  if( n
1eb30 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Page==0 ){.    i
1eb40 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb60 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20  Size of db file 
1eb70 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
1eb80 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1eb90 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
1eba0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1ebb0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
1ebc0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
1ebd0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
1ebe0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1ebf0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
1ec00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ec10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ec20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ec30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ec40 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29    nPage = (Pgno)
1ec50 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  (n / pPager->pag
1ec60 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
1ec70 6e 50 61 67 65 3d 3d 30 20 26 26 20 6e 3e 30 20  nPage==0 && n>0 
1ec80 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1ec90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
1eca0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1ecb0 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
1ecc0 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
1ecd0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
1ece0 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
1ecf0 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1ed00 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1ed10 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1ed20 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1ed30 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1ed40 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1ed50 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1ed60 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1ed70 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1ed80 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1ed90 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1eda0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1edb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1edc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1edd0 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
1ede0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
1edf0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
1ee00 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1ee10 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
1ee20 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
1ee30 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1ee40 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
1ee50 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
1ee60 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
1ee70 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
1ee80 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
1ee90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1eea0 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
1eeb0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1eec0 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
1eed0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1eee0 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
1eef0 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
1ef00 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
1ef10 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
1ef20 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
1ef30 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
1ef40 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
1ef50 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
1ef60 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
1ef70 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
1ef80 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
1ef90 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
1efa0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1efb0 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
1efc0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
1efd0 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
1efe0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
1eff0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f000 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
1f010 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
1f020 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
1f030 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
1f040 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
1f050 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
1f060 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
1f070 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
1f080 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
1f090 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
1f0a0 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
1f0b0 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
1f0c0 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
1f0d0 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
1f0e0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
1f0f0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
1f100 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1f110 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
1f120 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
1f130 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1f140 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f150 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f160 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1f170 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1f180 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1f190 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1f1a0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
1f1b0 6b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  k );..  if( !pPa
1f1c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1f1d0 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20  .    int isWal; 
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41     /* True if WA
1f200 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  L file exists */
1f210 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  .    Pgno nPage;
1f220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f230 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1f240 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f250 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  */..    rc = pag
1f260 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1f270 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1f280 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f290 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61   rc;.    if( nPa
1f2a0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ge==0 ){.      r
1f2b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1f2c0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
1f2d0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1f2e0 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  0);.      isWal 
1f2f0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1f300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f310 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
1f320 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
1f330 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
1f340 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1f350 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
1f360 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
1f370 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f380 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1f390 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
1f3a0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1f3b0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
1f3c0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
1f3d0 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
1f3e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f3f0 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
1f400 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
1f410 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1f420 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1f430 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1f440 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
1f450 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1f460 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
1f470 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
1f480 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1f490 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1f4a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
1f4b0 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
1f4c0 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
1f4d0 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
1f4e0 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
1f4f0 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
1f500 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f510 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
1f520 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
1f530 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
1f540 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
1f550 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
1f560 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
1f570 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
1f580 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
1f590 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
1f5a0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
1f5b0 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
1f5c0 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
1f5d0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
1f5e0 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
1f5f0 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
1f600 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
1f610 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
1f620 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
1f630 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
1f640 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
1f650 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
1f660 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
1f670 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
1f680 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
1f690 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
1f6a0 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1f6b0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
1f6c0 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
1f6d0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
1f6e0 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
1f6f0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1f700 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
1f710 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
1f720 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1f730 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
1f740 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
1f750 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1f760 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
1f770 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
1f780 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
1f790 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
1f7a0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1f7b0 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
1f7c0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
1f7d0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
1f7e0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1f7f0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1f800 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1f810 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
1f820 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
1f830 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1f840 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1f850 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
1f860 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
1f870 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
1f880 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
1f890 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
1f8a0 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
1f8b0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
1f8c0 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
1f8d0 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
1f8e0 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
1f8f0 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
1f900 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
1f910 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
1f920 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
1f930 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
1f940 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
1f950 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1f960 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
1f970 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
1f980 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
1f990 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
1f9a0 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
1f9b0 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
1f9c0 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
1f9d0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
1f9e0 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
1f9f0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
1fa00 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
1fa10 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
1fa20 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
1fa30 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
1fa40 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
1fa50 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
1fa60 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
1fa70 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
1fa80 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
1fa90 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
1faa0 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
1fab0 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
1fac0 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
1fad0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1fae0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
1faf0 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
1fb00 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
1fb10 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
1fb20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
1fb30 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
1fb40 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
1fb50 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
1fb60 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
1fb70 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
1fb80 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
1fb90 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
1fba0 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
1fbb0 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
1fbc0 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
1fbd0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1fbe0 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
1fbf0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
1fc00 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
1fc10 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
1fc20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
1fc30 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
1fc40 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
1fc50 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
1fc60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1fc70 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1fc80 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
1fc90 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
1fca0 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
1fcb0 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
1fcc0 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
1fcd0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1fce0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
1fcf0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
1fd00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fd10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1fd20 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
1fd30 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1fd40 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
1fd50 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
1fd60 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
1fd70 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
1fd80 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
1fd90 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
1fda0 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
1fdb0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
1fdc0 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
1fdd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1fde0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1fdf0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
1fe00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1fe10 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
1fe20 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
1fe30 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
1fe40 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
1fe50 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
1fe60 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1fe70 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
1fe80 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
1fe90 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
1fea0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
1feb0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1fec0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1fed0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1fee0 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
1fef0 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
1ff00 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
1ff10 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
1ff20 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
1ff30 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
1ff40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1ff50 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
1ff60 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
1ff70 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
1ff80 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
1ff90 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
1ffa0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
1ffb0 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
1ffc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
1ffd0 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
1ffe0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
1fff0 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
20000 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
20010 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20020 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
20030 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
20040 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
20050 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
20060 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20070 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
20080 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
20090 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
200a0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
200b0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
200c0 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
200d0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
200e0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
200f0 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
20100 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
20110 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
20120 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
20130 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20140 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
20150 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
20160 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
20170 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
20180 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
20190 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
201a0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
201b0 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
201c0 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
201d0 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
201e0 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
201f0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
20200 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20210 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
20220 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20230 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
20240 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
20250 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
20260 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
20270 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
20280 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
20290 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
202a0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
202b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
202c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
202d0 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
202e0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
202f0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
20300 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
20310 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
20320 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
20330 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20340 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
20350 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
20360 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
20370 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
20380 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
20390 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
203a0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
203b0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
203c0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
203d0 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
203e0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
203f0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
20400 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
20410 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20420 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
20430 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
20440 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
20450 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
20460 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
20470 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
20480 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
20490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
204a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
204b0 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
204c0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
204d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
204e0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
204f0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
20500 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
20510 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
20520 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
20530 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
20540 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
20550 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
20560 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
20570 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
20580 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
20590 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
205a0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
205b0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
205c0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
205d0 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
205e0 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
205f0 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
20600 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
20610 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
20620 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
20630 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
20640 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
20650 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
20660 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
20670 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
20680 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
20690 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
206a0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
206b0 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
206c0 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
206d0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
206e0 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
206f0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
20700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
20710 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
20720 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
20730 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
20740 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
20750 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
20760 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
20770 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
20780 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20790 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
207a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
207b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
207c0 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
207d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
207e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
207f0 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
20800 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
20810 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
20820 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
20830 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
20840 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
20850 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
20860 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
20870 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
20880 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
20890 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
208a0 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
208b0 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
208c0 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
208d0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
208e0 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
208f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20900 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
20910 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
20920 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75   pSavepoint->iSu
20930 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
20940 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
20950 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
20960 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
20970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
20980 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50  SavepointUndo(pP
20990 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76  ager->pWal, pSav
209a0 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61  epoint->aWalData
209b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
209c0 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
209d0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
209e0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
209f0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
20a00 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
20a10 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34  t( offset==ii*(4
20a20 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
20a30 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
20a40 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
20a50 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
20a60 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c   &offset, pDone,
20a70 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
20a80 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20a90 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
20aa0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
20ab0 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
20ac0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20ad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
20ae0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
20af0 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   szJ;.  }..  ret
20b00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20b10 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
20b20 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
20b30 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
20b40 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
20b50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
20b60 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
20b70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20b80 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
20b90 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
20ba0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
20bb0 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
20bc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
20bd0 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
20be0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
20bf0 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
20c00 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
20c10 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
20c20 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
20c30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
20c40 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
20c50 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
20c60 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
20c70 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
20c80 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
20c90 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
20ca0 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
20cb0 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
20cc0 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
20ce0 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
20cf0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
20d00 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
20d10 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
20d20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
20d30 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
20d40 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
20d50 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
20d60 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
20d70 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
20d80 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
20d90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
20da0 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
20db0 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
20dc0 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
20dd0 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
20de0 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
20df0 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
20e00 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
20e10 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
20e20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
20e30 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
20e40 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
20e50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
20e60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20e70 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
20e80 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
20e90 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
20ea0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
20eb0 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
20ec0 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
20ed0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20ee0 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
20ef0 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
20f00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
20f10 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
20f30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
20f40 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
20f50 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
20f60 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
20f70 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
20f80 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
20f90 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
20fb0 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
20fc0 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
20fd0 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
20fe0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
20ff0 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
21000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
21010 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
21020 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
21030 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
21040 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
21050 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
21060 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
21070 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f  k..**.** The abo
21080 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c  ve is for a roll
21090 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  back-journal mod
210a0 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65  e.  For WAL mode
210b0 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a  , OFF continues.
210c0 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20  ** to mean that 
210d0 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63  no syncs ever oc
210e0 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61  cur.  NORMAL mea
210f0 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20  ns that the WAL 
21100 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69  is synced.** pri
21110 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
21120 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  of checkpoint an
21130 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
21140 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63  ase file is sync
21150 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ed.** at the con
21160 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  clusion of the c
21170 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
21180 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
21190 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61  of the WAL.** wa
211a0 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  s written back i
211b0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
211c0 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f  .  But no sync o
211d0 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20  perations occur 
211e0 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  for.** an ordina
211f0 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52  ry commit in NOR
21200 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41  MAL mode with WA
21210 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74  L.  FULL means t
21220 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66  hat the WAL.** f
21230 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f  ile is synced fo
21240 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d  llowing each com
21250 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  mit operation, i
21260 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
21270 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63  e.** syncs assoc
21280 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41  iated with NORMA
21290 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  L..**.** Do not 
212a0 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e  confuse synchron
212b0 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51  ous=FULL with SQ
212c0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20  LITE_SYNC_FULL. 
212d0 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   The.** SQLITE_S
212e0 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d  YNC_FULL macro m
212f0 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20  eans to use the 
21300 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c  MacOSX-style ful
21310 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67  l-fsync.** using
21320 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59   fcntl(F_FULLFSY
21330 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e  NC).  SQLITE_SYN
21340 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74  C_NORMAL means t
21350 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  o do an.** ordin
21360 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c  ary fsync() call
21370 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
21380 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
21390 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  n SQLITE_SYNC_FU
213a0 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45  LL.** and SQLITE
213b0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20  _SYNC_NORMAL on 
213c0 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20  platforms other 
213d0 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75  than MacOSX.  Bu
213e0 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f  t the.** synchro
213f0 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73  nous=FULL versus
21400 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
21410 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65  MAL setting dete
21420 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74  rmines when.** t
21430 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69  he xSync primiti
21440 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  ve is called and
21450 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20   is relevant to 
21460 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a  all platforms..*
21470 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
21480 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
21490 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
214a0 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
214b0 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
214c0 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
214d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
214e0 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
214f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
21500 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61  afetyLevel(.  Pa
21510 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
21520 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
21530 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
21540 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  evel for */.  in
21550 74 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  t level,        
21560 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79      /* PRAGMA sy
21570 6e 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46  nchronous.  1=OF
21580 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46  F, 2=NORMAL, 3=F
21590 55 4c 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62  ULL */  .  int b
215a0 46 75 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20  FullFsync,      
215b0 20 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66   /* PRAGMA fullf
215c0 73 79 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43  sync */.  int bC
215d0 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20  kptFullFsync    
215e0 2f 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70  /* PRAGMA checkp
215f0 6f 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a  oint_fullfsync *
21600 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c  /.){.  assert( l
21610 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c  evel>=1 && level
21620 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  <=3 );.  pPager-
21630 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
21640 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
21650 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
21660 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
21670 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
21680 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
21690 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28  ile) ?1:0;.  if(
216a0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
216b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
216c0 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
216d0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
216e0 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  ncFlags = 0;.  }
216f0 65 6c 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73  else if( bFullFs
21700 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
21710 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
21720 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
21730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
21740 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
21750 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
21760 20 7d 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74   }else if( bCkpt
21770 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20  FullFsync ){.   
21780 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
21790 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
217a0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
217b0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
217c0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
217d0 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _FULL;.  }else{.
217e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
217f0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
21800 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
21810 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
21820 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
21830 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
21840 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
21850 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
21860 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
21870 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
21880 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
21890 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
218a0 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
218b0 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
218c0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
218d0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
218e0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
218f0 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
21900 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
21910 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
21920 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
21930 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
21940 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
21950 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
21960 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
21970 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
21980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
21990 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
219a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
219b0 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
219c0 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
219d0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
219e0 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
219f0 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
21a00 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
21a10 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
21a20 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
21a30 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
21a40 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
21a50 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
21a60 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
21a70 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
21a80 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
21a90 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
21aa0 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
21ab0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
21ac0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
21ad0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
21ae0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
21af0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
21b00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
21b10 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
21b20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
21b30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
21b40 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
21b50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
21b60 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
21b70 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
21b80 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
21b90 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
21ba0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
21bb0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
21bc0 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
21bd0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
21be0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
21bf0 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
21c00 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
21c10 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
21c20 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
21c30 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
21c40 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
21c50 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
21c60 73 20 7c 3d 20 20 0a 23 69 66 20 53 51 4c 49 54  s |=  .#if SQLIT
21c70 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
21c80 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20  OTECTION.       
21c90 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
21ca0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
21cb0 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
21cc0 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21ce0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
21cf0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
21d00 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
21d10 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21d20 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
21d30 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
21d40 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
21d50 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
21d60 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
21d70 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
21d80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
21d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
21da0 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
21db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21dc0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
21dd0 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
21de0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
21df0 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
21e00 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
21e10 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
21e20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
21e30 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
21e40 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
21e50 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
21e60 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
21e70 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
21e80 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
21e90 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
21ea0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
21eb0 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
21ec0 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
21ed0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
21ee0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
21ef0 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
21f00 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
21f10 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
21f20 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
21f30 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
21f40 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
21f50 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
21f60 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
21f70 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
21fa0 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
21fb0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
21fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
21ff0 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
22000 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
22010 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
22020 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
22030 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
22040 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
22050 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
22060 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
22070 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
22080 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
22090 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
220a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
220b0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
220c0 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
220d0 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
220e0 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
220f0 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
22100 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
22110 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
22120 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
22130 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
22140 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
22150 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
22160 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
22170 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
22180 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
221a0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
221b0 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
221c0 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
221d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
221e0 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
221f0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
22200 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
22210 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
22220 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
22230 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
22240 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
22250 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75    .  pPager->xBu
22260 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
22270 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
22280 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
22290 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
222a0 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erArg;.}../*.** 
222b0 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
222c0 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
222d0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
222e0 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
222f0 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
22300 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
22310 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
22320 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
22330 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
22340 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
22350 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
22360 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
22370 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
22380 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
22390 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
223a0 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
223b0 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
223c0 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
223d0 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
223e0 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
223f0 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
22400 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
22410 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
22420 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
22430 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
22440 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
22450 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
22460 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
22470 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
22480 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
22490 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
224a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
224b0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
224c0 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
224d0 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
224e0 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
224f0 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
22500 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
22510 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
22520 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
22530 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
22540 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
22550 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
22560 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
22570 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
22580 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
22590 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
225a0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
225b0 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
225c0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
225d0 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
225e0 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
225f0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
22600 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
22610 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
22620 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
22630 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
22640 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
22650 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
22660 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
22670 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
22680 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
22690 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
226a0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
226b0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
226c0 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
226d0 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
226e0 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
226f0 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
22700 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
22710 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
22720 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
22730 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
22740 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
22750 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
22760 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
22770 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
22780 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
22790 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
227a0 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
227b0 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
227c0 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
227d0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
227e0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
227f0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
22800 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
22810 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
22820 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22830 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
22840 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
22850 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
22860 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
22870 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
22880 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
22890 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
228a0 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
228b0 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
228c0 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
228d0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
228e0 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
228f0 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
22900 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
22910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
22920 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
22930 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
22940 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
22950 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
22960 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
22970 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
22980 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
22990 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
229a0 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
229b0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
229c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
229d0 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
229e0 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
229f0 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
22a00 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
22a10 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
22a20 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
22a30 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
22a40 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
22a50 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
22a60 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
22a70 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
22a80 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
22a90 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
22aa0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
22ab0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22ac0 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
22ad0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
22ae0 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
22af0 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
22b00 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
22b10 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
22b20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
22b30 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
22b40 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
22b50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
22b60 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
22b70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
22b80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
22b90 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
22ba0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
22bb0 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
22bc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22bd0 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
22be0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
22bf0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
22c00 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
22c10 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
22c20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22c30 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
22c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22c50 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
22c60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
22c70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
22c80 67 6e 6f 29 28 6e 42 79 74 65 2f 70 61 67 65 53  gno)(nByte/pageS
22c90 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
22ca0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
22cb0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73  ageSize;.      s
22cc0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
22cd0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
22ce0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
22cf0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
22d00 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
22d10 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
22d20 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
22d30 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
22d40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
22d50 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
22d60 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
22d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22d80 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
22d90 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
22da0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
22db0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
22dc0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
22dd0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
22de0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
22df0 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
22e00 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
22e10 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
22e20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22e30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
22e40 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22e50 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
22e60 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
22e70 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
22e80 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
22e90 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
22ea0 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
22eb0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
22ec0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
22ed0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
22ee0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
22ef0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
22f00 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
22f10 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
22f20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
22f30 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
22f40 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
22f50 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
22f60 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
22f70 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
22f80 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
22f90 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
22fa0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
22fb0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
22fc0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
22fd0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
22fe0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
22ff0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
23000 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
23010 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
23020 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
23030 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
23040 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
23050 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
23060 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
23070 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
23080 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
23090 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
230a0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
230b0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
230c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
230d0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
230e0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
230f0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
23100 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
23110 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
23120 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
23130 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
23140 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
23150 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
23160 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
23170 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
23180 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
23190 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
231a0 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
231b0 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
231c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
231d0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
231e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
231f0 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
23200 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
23210 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
23220 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
23230 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23240 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
23250 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
23260 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
23270 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
23280 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
23290 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
232a0 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
232b0 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
232c0 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
232d0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
232e0 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
232f0 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
23300 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
23310 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
23320 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
23330 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
23340 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
23350 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
23360 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
23370 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
23380 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
23390 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
233a0 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
233b0 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
233c0 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
233d0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
233e0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
233f0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
23400 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
23410 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
23420 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
23430 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
23440 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
23450 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
23460 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
23470 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
23480 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
23490 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
234a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
234b0 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
234c0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
234d0 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
234e0 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
234f0 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
23500 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
23510 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
23520 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
23530 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
23540 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
23550 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
23560 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
23570 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
23580 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
23590 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
235a0 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
235b0 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
235c0 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
235d0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
235e0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
235f0 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
23600 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
23610 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
23620 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
23630 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
23640 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
23650 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
23660 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
23670 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
23680 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
23690 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
236a0 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
236b0 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
236c0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
236d0 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
236e0 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
236f0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
23700 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
23710 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
23720 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
23730 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
23740 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
23750 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
23760 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
23770 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
23780 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
23790 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
237a0 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
237b0 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
237c0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
237d0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
237e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
237f0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
23800 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
23810 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
23820 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
23830 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
23840 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
23850 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
23860 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
23870 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
23880 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
23890 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
238a0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
238b0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
238c0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
238d0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
238e0 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
238f0 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
23900 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
23910 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
23920 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
23930 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
23940 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
23950 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
23960 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23970 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
23980 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23990 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
239a0 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
239b0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
239c0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
239d0 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
239e0 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
239f0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
23a00 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
23a10 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
23a20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
23a30 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
23a40 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
23a50 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
23a60 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
23a70 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
23a80 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
23a90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
23aa0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
23ab0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
23ac0 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
23ad0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
23ae0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
23af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
23b00 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
23b10 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
23b20 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
23b30 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
23b40 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
23b50 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
23b60 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
23b70 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
23b80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
23b90 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
23ba0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
23bb0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
23bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23bd0 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
23be0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
23bf0 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
23c00 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
23c10 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
23c20 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
23c30 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
23c40 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
23c50 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
23c60 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
23c70 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
23c80 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
23c90 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
23ca0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
23cb0 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
23cc0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
23cd0 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
23ce0 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
23cf0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
23d00 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
23d10 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
23d20 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
23d30 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
23d40 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
23d50 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
23d60 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
23d70 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
23d80 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
23d90 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
23da0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
23db0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
23dc0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
23dd0 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
23de0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e10 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
23e20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
23e30 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
23e40 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
23e50 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
23e60 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
23e70 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
23e80 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
23e90 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
23ea0 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
23eb0 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
23ec0 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
23ed0 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
23ee0 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
23ef0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
23f00 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
23f10 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
23f20 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
23f30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
23f40 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
23f50 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
23f60 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
23f70 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
23f80 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
23f90 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
23fa0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
23fb0 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
23fc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
23fd0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
23fe0 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
23ff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
24000 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
24010 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
24020 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
24030 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
24040 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
24050 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
24060 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
24070 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
24080 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
24090 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
240a0 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
240b0 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
240c0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
240d0 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
240e0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
240f0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
24100 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
24110 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
24120 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
24130 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
24140 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
24150 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
24160 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
24170 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
24180 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
24190 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
241a0 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
241b0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
241c0 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
241d0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
241e0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
241f0 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
24200 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
24210 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
24220 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
24230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
24240 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
24250 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
24260 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
24270 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
24280 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
24290 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
242a0 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
242b0 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
242c0 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
242d0 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
242e0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
242f0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
24300 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
24310 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
24320 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
24330 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
24340 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
24350 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  our would be to 
24360 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
24370 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
24380 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
24390 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
243a0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
243b0 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
243c0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
243d0 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
243e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
243f0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
24400 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
24410 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
24420 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
24430 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
24440 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
24450 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
24460 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
24470 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
24480 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
24490 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
244a0 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
244b0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
244c0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
244d0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
244e0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
244f0 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
24500 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
24510 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
24520 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
24530 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
24540 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
24550 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
24560 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
24570 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
24580 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
24590 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
245a0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
245b0 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
245c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
245d0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
245e0 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
245f0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
24600 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24610 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
24620 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
24630 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
24640 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
24650 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
24660 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
24670 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
24680 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
24690 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
246a0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
246b0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
246c0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
246d0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
246e0 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
246f0 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
24700 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
24710 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
24720 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
24730 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ommitted..*/.voi
24740 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
24750 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
24760 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
24770 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
24780 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
24790 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
247a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
247b0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
247c0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
247d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
247e0 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74   nPage;.  assert
247f0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24800 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a  nt(pPager);.}...
24810 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24820 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
24830 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
24840 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
24850 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
24860 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
24870 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
24880 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
24890 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
248a0 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
248b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
248c0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
248d0 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
248e0 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
248f0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
24900 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
24910 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
24920 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
24930 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
24940 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
24950 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
24960 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
24970 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
24980 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
24990 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
249a0 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
249b0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
249c0 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
249d0 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
249e0 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
249f0 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
24a00 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
24a10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
24a20 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
24a30 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
24a40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
24a50 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
24a60 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
24a70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24a80 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
24a90 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
24aa0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
24ab0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
24ac0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
24ad0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
24ae0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
24af0 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
24b00 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
24b10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
24b30 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
24b40 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
24b50 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
24b60 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
24b70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24b80 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
24b90 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
24ba0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
24bb0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
24bc0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
24bd0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
24be0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
24bf0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
24c00 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
24c10 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
24c20 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
24c30 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
24c40 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
24c50 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
24c60 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
24c70 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
24c80 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
24c90 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
24ca0 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
24cb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
24cc0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
24cd0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
24ce0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
24cf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
24d00 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
24d10 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
24d20 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
24d30 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
24d40 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
24d50 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
24d60 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
24d70 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
24d80 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
24d90 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
24da0 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
24db0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
24dc0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
24dd0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
24de0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
24df0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75  er *pPager){.  u
24e00 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29  8 *pTmp = (u8 *)
24e10 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24e20 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73  e;..  assert( as
24e30 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
24e40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69  (pPager) );.  di
24e50 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24e60 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
24e70 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
24e80 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20  nMalloc();.  /* 
24e90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
24ea0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
24eb0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
24ec0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
24ed0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
24ee0 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
24ef0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61  Pager->pWal, pPa
24f00 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
24f10 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
24f20 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70  Size, pTmp);.  p
24f30 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
24f40 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
24f50 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
24f60 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
24f70 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
24f80 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
24f90 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
24fa0 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
24fb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
24fc0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
24fd0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
24fe0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
24ff0 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
25000 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
25010 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
25020 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
25030 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
25040 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
25050 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
25060 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
25070 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
25080 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
25090 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
250a0 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
250b0 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
250c0 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
250d0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
250e0 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
250f0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
25100 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
25110 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
25120 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
25130 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
25140 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
25150 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
25160 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
25170 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25180 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
25190 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
251a0 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
251b0 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
251c0 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
251d0 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
251e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
251f0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
25200 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
25210 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25230 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
25240 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
25250 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
25260 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
25270 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
25280 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
25290 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
252a0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
252b0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
252c0 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
252d0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
252e0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
252f0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
25300 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
25310 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
25320 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
25330 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
25340 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
25350 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
25360 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
25370 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
25380 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
25390 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
253a0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
253b0 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
253c0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
253d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
253e0 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
253f0 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
25400 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
25410 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
25420 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
25430 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
25440 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
25450 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
25460 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
25470 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
25480 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
25490 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
254a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
254b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
254c0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
254d0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
254e0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
254f0 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
25500 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
25510 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
25520 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
25530 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
25540 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
25550 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
25560 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
25570 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
25580 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
25590 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
255a0 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
255b0 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
255c0 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
255d0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
255e0 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
255f0 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
25600 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
25610 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
25620 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
25630 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
25640 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
25650 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
25660 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
25670 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
25680 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
25690 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
256a0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
256b0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
256c0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
256d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
256e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
256f0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
25700 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
25710 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
25720 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
25730 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
25740 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
25750 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
25760 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
25770 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
25780 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25790 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
257a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
257b0 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
257c0 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
257d0 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
257e0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
257f0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
25800 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
25810 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
25820 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
25830 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
25840 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
25850 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
25860 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
25870 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
25880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
25890 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
258a0 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
258b0 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
258c0 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
258d0 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
258e0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
258f0 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
25900 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
25910 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
25920 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
25930 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
25940 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
25950 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
25960 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
25970 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
25980 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
25990 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
259a0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
259b0 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
259c0 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
259d0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
259e0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
259f0 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
25a00 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
25a10 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
25a20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
25a30 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
25a40 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
25a50 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
25a60 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
25a70 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
25a80 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
25a90 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
25aa0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
25ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
25ac0 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
25ad0 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
25ae0 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
25af0 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
25b00 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
25b10 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
25b20 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
25b30 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
25b40 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
25b50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
25b60 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
25b70 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
25b80 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
25b90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25ba0 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
25bb0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25bd0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25be0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
25bf0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
25c00 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
25c10 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
25c20 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
25c30 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
25c40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
25c50 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
25c60 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
25c70 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
25c80 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
25c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25ca0 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
25cb0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
25cc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
25cd0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
25ce0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
25cf0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
25d00 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
25d10 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
25d20 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25d30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
25d40 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
25d50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
25d60 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
25d70 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
25d80 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
25d90 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
25da0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
25db0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
25dc0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
25dd0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
25de0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
25df0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
25e00 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
25e10 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
25e20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
25e30 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
25e40 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
25e50 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
25e60 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
25e70 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
25e80 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
25e90 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
25ea0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
25eb0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
25ec0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
25ed0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
25ee0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
25ef0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
25f00 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
25f10 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
25f20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
25f30 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
25f40 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
25f50 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
25f60 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
25f70 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
25f80 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
25f90 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
25fa0 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
25fb0 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
25fc0 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
25fd0 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
25fe0 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
25ff0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
26000 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
26010 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
26020 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
26030 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
26040 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
26050 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
26060 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
26070 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
26080 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
26090 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
260a0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
260b0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
260c0 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
260d0 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
260e0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
260f0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
26100 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
26110 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
26120 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
26130 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
26140 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
26150 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
26160 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
26170 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26180 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
26190 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
261a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
261b0 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
261c0 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
261d0 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
261e0 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
261f0 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
26200 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
26210 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
26220 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
26230 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
26240 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
26250 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
26260 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
26270 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
26280 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
26290 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
262a0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
262b0 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
262c0 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
262d0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
262e0 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
262f0 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
26300 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
26310 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
26320 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
26330 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
26340 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
26350 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
26360 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26370 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
26380 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
26390 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
263a0 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
263b0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
263c0 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
263d0 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
263e0 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
263f0 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
26400 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
26410 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
26420 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
26430 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
26440 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
26450 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
26460 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
26470 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
26480 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26490 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
264a0 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
264b0 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
264c0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
264d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
264e0 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
264f0 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
26500 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
26510 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
26520 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
26530 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26540 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
26550 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
26560 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
26570 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
26580 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
265a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
265b0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
265c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
265d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
265e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
265f0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
26600 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
26610 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
26620 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
26630 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
26640 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
26650 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
26660 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
26670 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
26680 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
26690 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
266a0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
266b0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
266c0 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
266d0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
266e0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
266f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
26700 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
26710 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
26720 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
26730 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
26740 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
26750 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
26760 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
26770 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
26780 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
26790 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
267a0 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
267b0 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
267c0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
267d0 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
267e0 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
267f0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
26800 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
26810 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
26820 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
26830 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
26840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
26850 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
26860 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
26870 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
26880 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
26890 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
268a0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
268b0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
268c0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
268d0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
268e0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
268f0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
26900 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26910 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
26920 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
26930 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
26940 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26950 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
26970 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
26980 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
26990 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
269a0 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
269b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
269c0 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
269d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
269e0 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
269f0 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
26a00 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
26a10 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
26a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26a30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26a40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
26a50 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
26a60 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
26a70 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
26a80 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
26a90 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
26aa0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
26ab0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
26ac0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
26ad0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
26ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26af0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
26b00 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
26b10 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
26b20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  (pPager->syncFla
26b30 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
26b40 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
26b50 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
26b60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
26b70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26b80 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
26b90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
26ba0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
26bb0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
26bc0 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  alOff;.      if(
26bd0 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69   newHdr && 0==(i
26be0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
26bf0 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
26c00 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
26c10 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
26c20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
26c30 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
26c40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26c50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
26c60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
26c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26c80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26c90 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
26ca0 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
26cb0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20   }..  /* Unless 
26cc0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
26cd0 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  noSync mode, the
26ce0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
26cf0 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63  s just .  ** suc
26d00 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
26d10 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c  . Either way, cl
26d20 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
26d30 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
26d40 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e  .  ** all pages.
26d50 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
26d60 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
26d70 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
26d80 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  che);.  pPager->
26d90 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
26da0 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61  RITER_DBMOD;.  a
26db0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
26dc0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
26dd0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
26de0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26df0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
26e00 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
26e10 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
26e20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
26e30 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
26e40 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
26e50 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
26e60 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
26e70 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
26e80 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
26e90 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
26ea0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26eb0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
26ec0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
26ed0 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
26ee0 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
26ef0 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
26f00 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
26f10 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
26f20 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
26f30 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
26f40 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
26f50 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
26f60 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
26f70 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
26f80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
26f90 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
26fa0 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
26fb0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
26fc0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
26fd0 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
26fe0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
26ff0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
27000 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
27010 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
27020 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
27030 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
27040 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
27050 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
27060 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
27070 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
27080 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
27090 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
270a0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
270b0 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
270c0 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
270d0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
270e0 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
270f0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
27100 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
27110 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
27120 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
27130 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27140 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
27150 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
27160 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
27170 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
27180 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
27190 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
271a0 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
271b0 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
271c0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
271d0 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
271e0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
271f0 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
27200 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
27210 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
27220 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
27230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27240 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
27250 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
27260 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
27270 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
27280 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
27290 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
272a0 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
272b0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
272c0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
272d0 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
272e0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
272f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27300 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
27310 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
27320 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
27330 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
27340 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
27350 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
27360 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
27370 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
27380 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
27390 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
273a0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
273b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
273c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
273d0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
273e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
273f0 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
27400 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27410 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
27420 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27430 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
27440 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
27450 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72  nly called for r
27460 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69  ollback pagers i
27470 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73  n WRITER_DBMOD s
27480 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tate. */.  asser
27490 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
274a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
274b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
274c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
274d0 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
274e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
274f0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
27500 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
27510 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
27520 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
27530 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
27540 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
27550 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
27560 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
27570 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
27580 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
27590 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
275a0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
275b0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
275c0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
275d0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
275e0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
275f0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
27600 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
27610 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
27620 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
27630 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
27640 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
27650 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
27660 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
27670 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
27680 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
27690 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
276a0 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
276b0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
276c0 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
276d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
276e0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
276f0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
27700 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27710 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  OK && pPager->db
27720 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 48  Size>pPager->dbH
27730 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 73  intSize ){.    s
27740 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
27750 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
27760 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
27770 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
27780 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
27790 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
277a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
277b0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
277c0 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
277d0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
277e0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
277f0 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
27800 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
27810 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
27820 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
27830 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
27840 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
27850 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
27860 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
27870 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
27880 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
27890 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
278a0 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
278b0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
278c0 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
278d0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
278e0 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
278f0 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
27900 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
27910 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
27920 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
27930 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
27940 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
27950 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
27960 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
27970 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
27980 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
27990 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
279a0 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
279b0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
279c0 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
279d0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
279e0 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
279f0 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
27a00 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
27a10 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
27a20 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
27a30 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
27a40 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
27a50 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
27a60 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a90 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
27aa0 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
27ab0 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
27ac0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
27ad0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
27ae0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
27af0 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
27b00 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
27b10 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
27b20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
27b30 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
27b40 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
27b50 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
27b60 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
27b70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
27b80 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
27b90 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
27ba0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
27bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27bc0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
27bd0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
27be0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
27bf0 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
27c00 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
27c10 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
27c20 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
27c30 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
27c40 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
27c50 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
27c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
27c70 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
27c80 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
27c90 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
27ca0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
27cb0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
27cc0 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
27cd0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
27ce0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
27cf0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
27d00 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
27d10 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
27d20 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
27d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27d40 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
27d50 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
27d60 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
27d70 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
27d80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
27d90 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
27da0 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
27db0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
27dc0 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
27dd0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
27de0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
27df0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
27e00 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
27e10 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
27e20 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
27e30 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
27e40 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
27e60 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
27e70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
27e80 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
27e90 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
27ea0 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
27eb0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
27ec0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
27ed0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
27ee0 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
27ef0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
27f00 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
27f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27f20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
27f30 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
27f40 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27f50 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
27f60 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
27f70 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
27f80 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
27f90 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
27fa0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
27fb0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
27fc0 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
27fd0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
27fe0 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
27ff0 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
28000 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
28010 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
28020 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
28030 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
28040 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
28050 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
28060 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
28070 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
28080 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
28090 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
280a0 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
280b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
280c0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
280d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
280e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
280f0 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
28100 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
28110 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
28120 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
28130 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
28140 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
28150 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
28160 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28170 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
28180 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
28190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
281a0 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
281b0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
281c0 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f  ->sjfd, SQLITE_O
281d0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
281e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
281f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28200 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
28210 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
28220 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
28230 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
28240 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20  rnal. .** It is 
28250 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
28260 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73  onsibility to us
28270 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  e subjRequiresPa
28280 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a  ge() to check .*
28290 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61  * that it is rea
282a0 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66  lly required bef
282b0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
282c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
282d0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
282e0 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
282f0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
28300 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
28310 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
28320 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
28330 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
28340 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
28350 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
28360 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
28370 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
28380 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
28390 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
283a0 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
283b0 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
283c0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
283d0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
283e0 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
283f0 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
28400 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
28410 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
28420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
28430 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
28440 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
28450 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28460 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
28470 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
28480 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
28490 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
284a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
284b0 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
284c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
284d0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
284e0 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
284f0 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
28500 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
28510 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
28520 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
28530 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72  r->jfd) || pager
28540 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
28550 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
28560 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
28570 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53  d) || pPager->nS
28580 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  ubRec==0 );.    
28590 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
285a0 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20  Wal(pPager) .   
285b0 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a        || pageInJ
285c0 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20  ournal(pPg) .   
285d0 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67        || pPg->pg
285e0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
285f0 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20  gSize .    );.  
28600 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
28610 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a  urnal(pPager);..
28620 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
28630 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70  b-journal was op
28640 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ened successfull
28650 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64  y (or was alread
28660 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20  y open),.    ** 
28670 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  write the journa
28680 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  l record into th
28690 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  e file.  */.    
286a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
286b0 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  K ){.      void 
286c0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
286d0 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f  ata;.      i64 o
286e0 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
286f0 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
28700 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
28710 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
28720 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
28730 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
28740 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
28750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28760 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
28770 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28780 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
28790 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
287a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
287b0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
287c0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
287d0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
287e0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
287f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
28800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28810 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28820 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
28830 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
28840 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28850 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
28860 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
28870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28880 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
28890 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
288a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
288b0 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
288c0 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
288d0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
288e0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
288f0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
28900 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
28910 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
28920 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
28930 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
28940 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
28950 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
28960 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
28970 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
28980 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
28990 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
289a0 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
289b0 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
289c0 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
289d0 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
289e0 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
289f0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
28a00 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
28a10 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
28a20 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
28a30 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
28a40 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
28a50 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
28a60 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
28a70 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
28a80 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
28a90 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
28aa0 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
28ab0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
28ac0 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
28ad0 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
28ae0 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
28af0 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
28b00 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
28b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
28b20 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
28b30 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
28b40 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
28b50 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
28b60 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
28b70 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
28b80 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
28b90 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
28ba0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
28bb0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
28bc0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
28bd0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
28be0 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
28bf0 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
28c00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
28c10 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
28c20 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
28c30 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
28c40 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
28c50 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
28c60 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
28c70 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
28c80 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
28c90 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
28ca0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
28cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
28cc0 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
28cd0 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
28ce0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
28cf0 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
28d00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28d10 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
28d20 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
28d30 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
28d40 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
28d50 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
28d60 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69  The doNotSyncSpi
28d70 6c 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20 64  ll flag is set d
28d80 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
28d90 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
28da0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
28db0 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
28dc0 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
28dd0 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
28de0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
28df0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
28e00 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
28e10 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
28e20 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
28e30 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
28e40 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
28e50 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
28e60 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
28e70 20 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61   flag inhibits a
28e80 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e  ll cache spillin
28e90 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  g regardless of 
28ea0 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20  whether.  ** or 
28eb0 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65  not a sync is re
28ec0 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73  quired.  This is
28ed0 20 73 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f   set during a ro
28ee0 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  llback..  **.  *
28ef0 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c  * Spilling is al
28f00 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68  so prohibited wh
28f10 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  en in an error s
28f20 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20  tate since that 
28f30 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20  could.  ** lead 
28f40 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
28f50 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65  uption.   In the
28f60 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
28f70 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20  ntaton it .  ** 
28f80 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
28f90 72 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  r sqlite3PcacheF
28fa0 65 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c  etch() to be cal
28fb0 6c 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46  led with createF
28fc0 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c  lag==1.  ** whil
28fd0 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  e in the error s
28fe0 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69  tate, hence it i
28ff0 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
29000 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
29010 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
29020 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
29030 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  te.  Nevertheles
29040 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20  s, we include a 
29050 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73  NEVER().  ** tes
29060 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20  t for the error 
29070 73 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67  state as a safeg
29080 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74  uard against fut
29090 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a  ure changes..  *
290a0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
290b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
290c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
290d0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
290e0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65  >doNotSpill ) re
290f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29100 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
29110 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20  NotSyncSpill && 
29120 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
29130 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
29140 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
29160 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
29170 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
29180 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
29190 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
291a0 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
291b0 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
291c0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28   log. */.    if(
291d0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
291e0 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20  e(pPg) ){ .     
291f0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
29200 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20  Page(pPg); .    
29210 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
29220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29230 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
29240 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
29250 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
29260 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
29270 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
29280 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
29290 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
292a0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
292b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20  HDR_NEED_SYNC . 
292c0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
292d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
292e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
292f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
29300 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
29310 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  r, 1);.    }.  .
29320 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
29330 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69  ge number of thi
29340 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72  s page is larger
29350 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
29360 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  t size of.    **
29370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
29380 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
29390 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
293a0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
293b0 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  l..    ** This i
293c0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
293d0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
293e0 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
293f0 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
29400 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
29410 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
29420 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
29430 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
29440 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
29450 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  owing sequence o
29460 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a  f events:.    **
29470 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  .    **   BEGIN;
29480 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  .    **     <jou
29490 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20  rnal page X>.   
294a0 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
294b0 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
294c0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
294d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  .    **       <s
294e0 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
294f0 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
29500 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67      **       pag
29510 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
29520 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  .    **     ROLL
29530 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20  BACK TO sp;.    
29540 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e  **.    ** If (X>
29550 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
29560 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
29570 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
29580 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
29590 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65     ** out to the
295a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
295b0 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70  but will be drop
295c0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ped from the cac
295d0 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a  he. Then,.    **
295e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
295f0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
29600 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
29610 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
29620 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ead.    ** data 
29630 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
29640 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
29650 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
29660 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
29670 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
29680 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
29690 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
296a0 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
296b0 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20  OINT sp".    ** 
296c0 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
296d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
296e0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77  solution is to w
296f0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
29700 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58   data for page X
29710 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
29720 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
29730 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
29740 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
29750 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
29760 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
29770 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63  estored to its c
29780 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65  urrent value whe
29790 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
297a0 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a  TO sp" is .    *
297b0 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  * executed..    
297c0 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
297d0 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  (.        rc==SQ
297e0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
297f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
29800 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
29810 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
29820 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
29830 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
29840 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  pPg);.    }.  . 
29850 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
29860 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
29870 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
29880 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
29890 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
298a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
298b0 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
298c0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
298d0 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
298e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
298f0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
29900 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a  er, pPg);.    }.
29910 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
29920 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
29930 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
29940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29950 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
29960 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
29970 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29980 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
29990 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
299a0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
299b0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
299c0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
299d0 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a  er, rc); .}.../*
299e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
299f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
29a00 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
29a10 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
29a20 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
29a30 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
29a40 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
29a50 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
29a60 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
29a70 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
29a80 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
29a90 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
29aa0 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
29ab0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29ac0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
29ad0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
29ae0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
29af0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
29b00 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
29b10 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
29b20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
29b30 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
29b40 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
29b50 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
29b60 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
29b70 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
29b80 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
29b90 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
29ba0 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
29bb0 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
29bc0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
29bd0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
29be0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
29bf0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
29c00 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
29c10 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
29c20 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
29c30 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
29c40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
29c50 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
29c60 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
29c70 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
29c80 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
29c90 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
29ca0 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
29cb0 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
29cc0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
29cd0 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
29ce0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
29cf0 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
29d00 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
29d10 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
29d20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
29d30 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
29d40 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
29d50 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
29d60 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
29d70 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
29d80 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52  L and PAGER_NO_R
29d90 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a  EADLOCK flags..*
29da0 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
29db0 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
29dc0 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
29dd0 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
29de0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
29df0 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
29e00 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
29e10 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
29e20 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
29e30 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
29e40 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
29e50 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
29e60 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
29e70 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
29e80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29e90 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
29ea0 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
29eb0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
29ec0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
29ed0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
29ee0 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
29ef0 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
29f00 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
29f10 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
29f20 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
29f30 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
29f40 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
29f50 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
29f60 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
29f70 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
29f80 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
29f90 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
29fa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
29fb0 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
29fc0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
29fd0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
29fe0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
29ff0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
2a000 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
2a010 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
2a020 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
2a030 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
2a040 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2a050 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
2a060 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2a070 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
2a080 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a0a0 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
2a0b0 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
2a0c0 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
2a0d0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2a0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2a0f0 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
2a100 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
2a110 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
2a120 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
2a130 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
2a140 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
2a150 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
2a160 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
2a170 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
2a180 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
2a190 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
2a1a0 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
2a1b0 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
2a1c0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2a1d0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
2a1e0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
2a1f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a200 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
2a210 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
2a220 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
2a230 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2a240 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
2a250 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
2a260 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
2a270 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
2a280 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2a290 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2a2a0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
2a2b0 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
2a2c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2a2d0 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
2a2e0 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
2a2f0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2a300 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
2a310 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
2a320 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
2a330 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
2a340 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
2a350 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
2a360 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2a370 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
2a380 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
2a390 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
2a3a0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
2a3b0 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
2a3c0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
2a3d0 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
2a3e0 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
2a3f0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
2a400 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
2a410 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
2a420 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20  _READLOCK)!=0;  
2a430 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
2a440 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69  read-lock */.  i
2a450 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
2a460 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2a470 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
2a480 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2a490 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
2a4a0 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u32 szPageDflt =
2a4b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2a4c0 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
2a4d0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2a4e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2a4f0 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f   *zUri = 0;    /
2a500 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f  * URI args to co
2a510 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69  py */.  int nUri
2a520 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a530 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2a540 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20  tes of URI args 
2a550 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f  at *zUri */..  /
2a560 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2a570 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
2a580 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
2a590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2a5a0 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
2a5b0 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
2a5c0 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
2a5d0 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
2a5e0 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20  ournal). This.  
2a5f0 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ** is the maximu
2a600 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  m space required
2a610 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
2a620 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  y journal file h
2a630 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20  andle .  ** and 
2a640 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  a regular journa
2a650 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e  l file-handle. N
2a660 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75  ote that a "regu
2a670 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64  lar journal-hand
2a680 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  le".  ** may be 
2a690 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c  a wrapper capabl
2a6a0 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65  e of caching the
2a6b0 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f   first portion o
2a6c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
2a6d0 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72  ** file in memor
2a6e0 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  y to implement t
2a6f0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2a700 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65  optimization (se
2a710 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66  e .  ** source f
2a720 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a  ile journal.c)..
2a730 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
2a740 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2a750 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  fs)>sqlite3MemJo
2a760 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20  urnalSize() ){. 
2a770 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2a780 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2a790 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2a7a0 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Vfs));.  }else{.
2a7b0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2a7c0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2a7d0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
2a7e0 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ze());.  }..  /*
2a7f0 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
2a800 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
2a810 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
2a820 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a  r occurs. */.  *
2a830 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69  ppPager = 0;..#i
2a840 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a850 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28  T_MEMORYDB.  if(
2a860 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d   flags & PAGER_M
2a870 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d  EMORY ){.    mem
2a880 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 46 69 6c  Db = 1;.    zFil
2a890 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 23  ename = 0;.  }.#
2a8a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
2a8b0 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
2a8c0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
2a8d0 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
2a8e0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
2a8f0 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
2a900 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
2a910 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
2a920 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
2a930 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
2a940 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
2a950 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
2a960 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
2a970 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2a980 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2a990 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2a9a0 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61   *z;.    nPathna
2a9b0 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
2a9c0 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
2a9d0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2a9e0 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
2a9f0 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2aa00 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2aa10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2aa20 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2aa30 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2aa40 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2aa50 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2aa60 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2aa70 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2aa80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2aa90 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2aaa0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2aab0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2aac0 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2aad0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2aae0 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2aaf0 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2ab00 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2ab10 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2ab20 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2ab30 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2ab40 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2ab50 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2ab60 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2ab70 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2ab80 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 26 7a 5b  }.    nUri = &z[
2ab90 31 5d 20 2d 20 7a 55 72 69 3b 0a 20 20 20 20 69  1] - zUri;.    i
2aba0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2abb0 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
2abc0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2abd0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
2abe0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
2abf0 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
2ac00 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
2ac10 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
2ac20 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
2ac30 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
2ac40 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
2ac50 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
2ac60 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
2ac70 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
2ac80 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
2ac90 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
2aca0 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
2acb0 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
2acc0 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
2acd0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
2ace0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
2acf0 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
2ad00 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
2ad10 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
2ad20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2ad30 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
2ad40 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2ad50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ad60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ad70 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2ad80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2ad90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
2ada0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
2adb0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2adc0 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a  ture, PCache obj
2add0 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68  ect, the.  ** th
2ade0 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ree file descrip
2adf0 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61  tors, the databa
2ae00 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  se file name and
2ae10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
2ae20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68  ** file name. Th
2ae30 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f  e layout in memo
2ae40 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ry is as follows
2ae50 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2ae60 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20  Pager object    
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae80 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62  (sizeof(Pager) b
2ae90 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50  ytes).  **     P
2aea0 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20  Cache object    
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2aec0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2aed0 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e() bytes).  ** 
2aee0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2aef0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2af00 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46      (pVfs->szOsF
2af10 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ile bytes).  ** 
2af20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20      Sub-journal 
2af30 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2af40 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2af50 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2af60 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61       Main journa
2af70 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2af80 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2af90 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2afa0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2afb0 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
2afc0 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2afd0 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  +1 bytes).  **  
2afe0 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
2aff0 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
2b000 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b     (nPathname+8+
2b010 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20  1 bytes).  */.  
2b020 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c  pPtr = (u8 *)sql
2b030 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
2b040 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
2b050 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20  f(*pPager)) +   
2b060 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
2b070 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55  cture */.    ROU
2b080 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20  ND8(pcacheSize) 
2b090 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
2b0a0 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Cache object */.
2b0b0 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d      ROUND8(pVfs-
2b0c0 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20  >szOsFile) +    
2b0d0 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
2b0e0 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
2b0f0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
2b100 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2 +          /* 
2b110 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
2b120 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50  files */ .    nP
2b130 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55  athname + 1 + nU
2b140 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  ri +         /* 
2b150 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20  zFilename */.   
2b160 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b   nPathname + 8 +
2b170 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
2b180 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  /* zJournal */.#
2b190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b1a0 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61  IT_WAL.    + nPa
2b1b0 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 31 20 20  thname + 4 + 1  
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2b1d0 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2b1e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2b1f0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2b200 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2b210 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2b220 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2b230 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2b240 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
2b250 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2b260 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2b270 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
2b280 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
2b290 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
2b2a0 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
2b2b0 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
2b2c0 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
2b2d0 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
2b2e0 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
2b2f0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2b300 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
2b310 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
2b320 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
2b330 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2b340 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
2b350 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
2b360 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
2b370 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2b380 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2b390 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
2b3a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
2b3b0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2b3c0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2b3d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2b3e0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2b3f0 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
2b400 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2b410 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
2b420 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
2b430 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
2b440 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2b450 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
2b460 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2b470 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20  Pathname>0 );.  
2b480 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
2b490 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
2b4a0 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
2b4b0 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20   + 1 + nUri);.  
2b4c0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2b4d0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2b4e0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2b4f0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2b500 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b510 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2b520 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2b530 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2b540 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2b550 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2b560 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2b570 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2b580 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2b590 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 73 71 6c  al", 8);.    sql
2b5a0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2b5b0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2b5c0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2b5d0 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2b5e0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2b5f0 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2b600 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2b610 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2b620 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2b630 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2b640 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2b650 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2b660 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2b670 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c 20  hname], "-wal", 
2b680 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  4);.    sqlite3F
2b690 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2b6a0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2b6b0 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2b6c0 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
2b6d0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
2b6e0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2b6f0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2b700 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2b710 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2b720 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2b730 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2b740 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2b750 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2b760 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b780 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2b790 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2b7a0 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2b7b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2b7c0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2b7d0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2b7e0 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2b7f0 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2b800 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2b810 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2b820 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2b830 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2b840 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2b850 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2b860 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2b870 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2b880 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2b890 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2b8a0 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2b8b0 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2b8c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2b8d0 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2b8e0 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2b8f0 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2b900 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2b910 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2b920 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2b930 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2b940 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2b950 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2b960 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2b970 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2b980 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2b990 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2b9a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2b9b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b9c0 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2b9d0 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
2b9e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2b9f0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2ba00 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2ba10 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2ba20 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2ba30 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2ba40 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2ba50 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2ba60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2ba70 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
2ba80 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2ba90 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
2baa0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2bab0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2bac0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2bad0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2bae0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2baf0 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2bb00 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2bb10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2bb20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2bb30 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2bb40 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
2bb50 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2bb60 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2bb70 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2bb80 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
2bb90 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
2bba0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2bbb0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2bbc0 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2bbd0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2bbe0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2bbf0 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2bc00 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2bc10 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2bc20 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2bc30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
2bc40 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2bc50 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2bc60 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2bc70 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2bc80 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
2bc90 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2bca0 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
2bcb0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2bcc0 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2bcd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2bce0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2bcf0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2bd00 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2bd10 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2bd20 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2bd30 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2bd40 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2bd50 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2bd60 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2bd70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2bd80 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2bd90 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2bda0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2bdb0 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2bdc0 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2bdd0 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2bde0 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2bdf0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2be00 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2be10 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2be20 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2be30 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2be40 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2be50 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2be60 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2be70 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2be80 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2be90 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
2bea0 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2beb0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2bec0 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
2bed0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2bee0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2bef0 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2bf00 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2bf10 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2bf20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2bf30 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2bf40 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2bf50 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2bf60 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2bf70 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2bf80 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2bf90 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2bfa0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2bfb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2bfc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bfd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2bfe0 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2bff0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c000 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2c010 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2c020 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2c030 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2c040 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2c050 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2c060 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  urred in either 
2c070 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
2c080 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20  ove, free the . 
2c090 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   ** Pager struct
2c0a0 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2c0b0 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2c0c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c0d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c0e0 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
2c0f0 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ce );.    sqlite
2c100 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2c110 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2c120 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2c130 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c140 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
2c150 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
2c160 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65  bject. */.  asse
2c170 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
2c180 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f  );.  nExtra = RO
2c190 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20  UND8(nExtra);.  
2c1a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2c1b0 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2c1c0 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1e0 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2c1f0 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2c200 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2c210 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47  pPCache);..  PAG
2c220 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
2c230 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
2c240 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
2c250 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
2c260 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
2c270 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
2c280 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2c290 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
2c2a0 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
2c2b0 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
2c2c0 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
2c2d0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e  >noReadlock = (n
2c2e0 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
2c2f0 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f  dOnly) ?1:0;.  /
2c300 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
2c310 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
2c320 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
2c330 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2c340 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
2c350 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2c360 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
2c370 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2c380 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
2c390 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
2c3a0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
2c3b0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
2c3c0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
2c3d0 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
2c3e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2c3f0 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20  _UNLOCK; */.#if 
2c400 30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  0.  assert( pPag
2c410 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
2c420 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
2c430 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
2c440 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64  _UNLOCK) );.#end
2c450 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  if.  /* pPager->
2c460 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
2c470 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
2c480 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
2c490 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
2c4a0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2c4b0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2c4c0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
2c4d0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2c4e0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2c4f0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2c500 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2c510 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
2c520 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
2c530 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2c540 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
2c550 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2c560 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
2c570 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2c580 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
2c590 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
2c5a0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
2c5b0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65  readOnly;.  asse
2c5c0 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
2c5d0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
2c5e0 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
2c5f0 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
2c600 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2c610 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
2c620 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
2c630 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
2c640 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
2c650 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20  r->noSync ? 0 : 
2c660 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2c670 41 4c 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  AL;.#if SQLITE_D
2c680 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46  EFAULT_CKPTFULLF
2c690 53 59 4e 43 0a 20 20 70 50 61 67 65 72 2d 3e 63  SYNC.  pPager->c
2c6a0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  kptSyncFlags = p
2c6b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20  Pager->noSync ? 
2c6c0 30 20 3a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  0 : SQLITE_SYNC_
2c6d0 46 55 4c 4c 3b 0a 23 65 6c 73 65 0a 20 20 70 50  FULL;.#else.  pP
2c6e0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2c6f0 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79  ags = pPager->sy
2c700 6e 63 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a  ncFlags;.#endif.
2c710 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2c720 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
2c730 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
2c740 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
2c750 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
2c760 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2c770 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
2c780 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
2c790 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2c7a0 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
2c7b0 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
2c7c0 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
2c7d0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2c7e0 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
2c7f0 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
2c800 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2c810 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
2c820 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2c830 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2c840 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2c850 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
2c860 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
2c870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2c880 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2c890 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
2c8a0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
2c8b0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
2c8c0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2c8d0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
2c8e0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2c8f0 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
2c900 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
2c910 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
2c920 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
2c930 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
2c940 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
2c950 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
2c960 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
2c970 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2c980 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2c990 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2c9a0 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2c9b0 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2c9c0 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2c9d0 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2c9e0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2c9f0 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2ca00 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2ca10 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2ca20 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2ca30 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2ca40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2ca50 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2ca60 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2ca70 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2ca80 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2ca90 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2caa0 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2cab0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2cac0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2cad0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2cae0 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2caf0 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2cb00 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2cb10 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2cb20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2cb30 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2cb40 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2cb50 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2cb60 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2cb70 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2cb80 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2cb90 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2cba0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2cbb0 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2cbc0 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2cbd0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2cbe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cbf0 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2cc00 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2cc10 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2cc20 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2cc30 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2cc40 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2cc50 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2cc60 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2cc70 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2cc80 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2cc90 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2cca0 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2ccb0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2ccc0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2ccd0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2cce0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ccf0 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2cd00 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2cd10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2cd20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2cd30 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2cd40 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2cd50 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2cd60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2cd70 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2cd80 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2cd90 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2cda0 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2cdb0 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2cdc0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2cdd0 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2cde0 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2cdf0 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2ce00 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2ce10 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2ce20 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2ce30 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2ce40 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2ce50 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2ce60 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2ce70 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2ce80 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2ce90 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2cea0 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2ceb0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2cec0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2ced0 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2cee0 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2cef0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2cf00 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2cf10 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2cf20 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2cf30 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2cf40 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2cf50 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2cf60 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
2cf70 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
2cf80 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2cf90 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
2cfa0 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
2cfb0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2cfc0 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
2cfd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2cfe0 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
2cff0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2d000 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2d010 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
2d020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d030 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2d040 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2d050 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
2d060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d070 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
2d080 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
2d090 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
2d0a0 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
2d0b0 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
2d0c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2d0d0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2d0e0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2d0f0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
2d100 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2d110 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2d120 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
2d130 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
2d140 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2d150 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2d160 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
2d170 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
2d180 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
2d190 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
2d1a0 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
2d1b0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2d1c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2d1d0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
2d1e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2d1f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2d200 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
2d210 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2d220 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
2d230 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
2d240 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
2d250 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d260 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
2d270 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2d280 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
2d290 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
2d2a0 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
2d2b0 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
2d2c0 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
2d2d0 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
2d2e0 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
2d2f0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
2d300 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
2d310 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
2d320 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
2d330 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
2d340 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
2d350 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
2d360 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
2d370 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2d380 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
2d390 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
2d3a0 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
2d3b0 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
2d3c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
2d3d0 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
2d3e0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2d3f0 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
2d400 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
2d410 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
2d420 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
2d430 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
2d440 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
2d450 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
2d460 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
2d470 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
2d480 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2d490 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2d4a0 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
2d4b0 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
2d4c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d4d0 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
2d4e0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2d4f0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2d500 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d510 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2d520 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2d530 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65      /* Check the
2d540 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2d550 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
2d560 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  t consists of 0 
2d570 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20  pages,.      ** 
2d580 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2d590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65  journal file. Se
2d5a0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
2d5b0 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a  ment above for .
2d5c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61        ** the rea
2d5d0 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65  soning here.  De
2d5e0 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74  lete the obsolet
2d5f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75  e journal file u
2d600 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20  nder.      ** a 
2d610 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
2d620 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64   avoid race cond
2d630 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76  itions and to av
2d640 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20  oid violating.  
2d650 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e      ** [H33020].
2d660 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d670 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2d680 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2d690 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2d6a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d6b0 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
2d6c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2d6d0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
2d6e0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2d6f0 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
2d700 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2d710 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
2d720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d730 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d740 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
2d750 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2d760 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2d770 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2d780 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
2d790 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
2d7a0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2d7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d7c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2d7d0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
2d7e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d7f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2d800 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2d810 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
2d820 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
2d830 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
2d840 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
2d850 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2d860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d870 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2d880 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
2d890 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
2d8a0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
2d8b0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2d8c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d8d0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
2d8e0 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
2d8f0 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
2d900 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
2d910 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
2d920 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
2d930 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
2d940 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2d950 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2d960 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2d970 20 20 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20     int f = .#if 
2d980 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
2d990 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61              (pPa
2d9b0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51  ger->vfsFlags&SQ
2d9c0 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52  LITE_OPEN_FILEPR
2d9d0 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a  OTECTION_MASK)|.
2d9e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
2d9f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
2da00 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
2da10 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2da20 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
2da30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2da40 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2da50 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
2da60 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
2da70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2da80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2da90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2daa0 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20         u8 first 
2dab0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2dac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2dad0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
2dae0 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c   (void *)&first,
2daf0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
2db00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2db10 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
2db20 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
2db30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2db40 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
2db50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2db60 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
2db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2db80 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2db90 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2dba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dbb0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
2dbc0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
2dbd0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2dbe0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
2dbf0 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
2dc00 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
2dc10 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
2dc20 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
2dc30 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
2dc40 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
2dc50 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
2dc60 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
2dc70 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
2dc80 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
2dc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2dca0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
2dcb0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
2dcc0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
2dcd0 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
2dce0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
2dcf0 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
2dd00 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
2dd10 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
2dd20 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
2dd30 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
2dd40 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
2dd50 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
2dd60 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
2dd70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
2dd80 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
2dd90 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
2dda0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
2ddb0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
2ddc0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
2ddd0 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
2dde0 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
2ddf0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
2de00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
2de10 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
2de20 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
2de30 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
2de40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
2de50 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
2de60 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2de70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2de80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2de90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2dea0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2deb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2dec0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2ded0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
2dee0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
2def0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
2df00 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
2df10 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2df20 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69  erAcquire() unti
2df30 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
2df40 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
2df50 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
2df60 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
2df70 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
2df80 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
2df90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2dfa0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2dfb0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
2dfc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
2dfd0 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
2dfe0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
2dff0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2e000 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
2e010 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
2e020 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
2e030 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
2e040 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
2e050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
2e060 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
2e070 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
2e080 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
2e090 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
2e0a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2e0b0 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
2e0c0 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
2e0d0 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
2e0e0 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
2e0f0 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
2e100 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2e110 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
2e120 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
2e130 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
2e140 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
2e150 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
2e160 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
2e170 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
2e180 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
2e190 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
2e1a0 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
2e1b0 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
2e1c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2e1d0 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
2e1e0 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
2e1f0 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
2e200 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
2e210 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
2e220 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
2e230 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
2e240 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
2e250 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
2e260 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
2e270 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2e280 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
2e290 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
2e2a0 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
2e2b0 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
2e2c0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
2e2d0 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
2e2e0 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
2e2f0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
2e300 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2e310 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
2e320 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
2e330 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
2e340 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
2e350 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
2e360 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2e370 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2e380 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2e390 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
2e3a0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
2e3b0 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
2e3c0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
2e3d0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a  rnal file or .**
2e3e0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
2e3f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2e400 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
2e410 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2e420 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2e430 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
2e440 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2e450 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e470 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2e480 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
2e490 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
2e4a0 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
2e4b0 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
2e4c0 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
2e4d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
2e4e0 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20  s. This implies 
2e4f0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73  that the pager s
2e500 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68  tate should eith
2e510 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20  er.  ** be OPEN 
2e520 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45  or READER. READE
2e530 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  R is only possib
2e540 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20  le if the pager 
2e550 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20  is or was in .  
2e560 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
2e570 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ess mode..  */. 
2e580 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e590 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
2e5a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
2e5b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2e5c0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
2e5d0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
2e5e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e5f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2e600 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
2e610 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
2e620 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ER );.  if( NEVE
2e630 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  R(MEMDB && pPage
2e640 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72  r->errCode) ){ r
2e650 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2e660 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20  rCode; }..  if( 
2e670 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2e680 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
2e690 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2e6a0 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48  EN ){.    int bH
2e6b0 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20  otJournal = 1;  
2e6c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e6d0 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
2e6e0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69  a hot journal-fi
2e6f0 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
2e700 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
2e710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e720 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c  >noReadlock==0 |
2e730 7c 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  | pPager->readOn
2e740 6c 79 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ly );..    if( p
2e750 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
2e760 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
2e770 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
2e780 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
2e790 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2e7a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e7b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
2e7c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2e7d0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
2e7e0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
2e7f0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
2e800 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2e810 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
2e820 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
2e830 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2e840 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
2e850 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
2e860 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
2e870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2e880 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
2e890 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
2e8a0 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
2e8b0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
2e8c0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
2e8d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
2e8e0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
2e8f0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
2e900 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
2e910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2e920 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e930 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
2e940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e950 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
2e960 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
2e970 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
2e980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e990 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
2e9a0 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
2e9b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
2e9c0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2e9d0 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
2e9e0 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
2e9f0 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
2ea00 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
2ea10 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
2ea20 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
2ea30 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
2ea40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
2ea50 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
2ea60 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
2ea70 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
2ea80 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2ea90 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
2eaa0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
2eab0 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
2eac0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
2ead0 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
2eae0 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
2eaf0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
2eb00 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
2eb10 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
2eb20 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
2eb30 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
2eb40 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
2eb50 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
2eb60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2eb70 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
2eb80 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
2eb90 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
2eba0 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
2ebb0 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
2ebc0 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
2ebd0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
2ebe0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
2ebf0 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
2ec00 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
2ec10 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  n locking_mode=e
2ec20 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
2ec30 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20  he lock is.     
2ec40 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74   ** downgraded t
2ec50 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65  o SHARED_LOCK be
2ec60 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
2ec70 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20  on returns..    
2ec80 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2ec90 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
2eca0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
2ecb0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
2ecc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ecd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2ece0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  led;.      }. . 
2ecf0 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73       /* If it is
2ed00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
2ed10 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65  n and the file e
2ed20 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f  xists on disk, o
2ed30 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  pen the .      *
2ed40 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  * journal for re
2ed50 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
2ed60 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73   Write access is
2ed70 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73   required becaus
2ed80 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65  e .      ** in e
2ed90 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
2eda0 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65  mode the file de
2edb0 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
2edc0 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20   kept open .    
2edd0 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c    ** and possibl
2ede0 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
2edf0 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
2ee00 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61  n. Also, write-a
2ee10 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20  ccess .      ** 
2ee20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69  is usually requi
2ee30 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  red to finalize 
2ee40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a  the journal in j
2ee50 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73  ournal_mode=pers
2ee60 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  ist .      ** mo
2ee70 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72  de (and also for
2ee80 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72   journal_mode=tr
2ee90 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73  uncate on some s
2eea0 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a  ystems)..      *
2eeb0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
2eec0 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
2eed0 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75  ot exist, it usu
2eee0 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  ally means that 
2eef0 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  some .      ** o
2ef00 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2ef10 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
2ef20 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
2ef30 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
2ef40 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
2ef50 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
2ef60 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2ef70 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
2ef80 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
2ef90 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
2efa0 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
2efb0 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
2efc0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
2efd0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e  on was called an
2efe0 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
2eff0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
2f000 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2f010 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2f020 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2f030 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
2f040 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2f050 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2f060 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73         int bExis
2f070 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
2f080 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
2f090 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2f0a0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2f0b0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2f0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
2f0d0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2f0e0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
2f0f0 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69  SS_EXISTS, &bExi
2f100 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sts);.        if
2f110 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f120 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20  && bExists ){.  
2f130 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
2f140 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2f150 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53 51 4c  int f = .#if SQL
2f160 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
2f170 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
2f180 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
2f190 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
2f1a0 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
2f1b0 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
2f1c0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  f.            SQ
2f1d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2f1e0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2f1f0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2f200 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f210 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2f220 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2f230 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2f240 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2f250 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2f260 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
2f270 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2f280 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2f290 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2f2a0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
2f2b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f2c0 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
2f2d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f2e0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
2f2f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f300 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2f310 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2f320 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2f330 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
2f340 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f350 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2f360 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
2f370 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2f380 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
2f390 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
2f3a0 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
2f3b0 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
2f3c0 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
2f3d0 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
2f3e0 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
2f3f0 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
2f400 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
2f410 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
2f420 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
2f430 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
2f440 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
2f450 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
2f460 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
2f470 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
2f480 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
2f490 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
2f4a0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
2f4b0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
2f4c0 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
2f4d0 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
2f4e0 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
2f4f0 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
2f500 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
2f510 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
2f520 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2f530 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2f540 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2f550 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2f560 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2f570 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
2f580 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
2f590 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
2f5a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f5b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2f5c0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2f5d0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2f5e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
2f5f0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
2f600 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
2f610 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
2f620 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2f630 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
2f640 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
2f650 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2f660 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2f670 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f680 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
2f690 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2f6a0 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
2f6b0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2f6c0 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
2f6d0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
2f6e0 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
2f6f0 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
2f700 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
2f710 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2f720 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
2f730 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
2f740 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2f750 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
2f760 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
2f770 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2f780 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
2f790 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
2f7a0 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
2f7b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
2f7c0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
2f7d0 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
2f7e0 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
2f7f0 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
2f800 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
2f810 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
2f820 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
2f830 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2f840 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
2f850 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
2f860 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
2f870 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
2f880 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
2f890 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
2f8a0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
2f8b0 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
2f8c0 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
2f8d0 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
2f8e0 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
2f8f0 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
2f900 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
2f910 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
2f920 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
2f930 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
2f940 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2f950 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
2f960 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
2f970 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
2f980 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
2f990 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
2f9a0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
2f9b0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2f9c0 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
2f9d0 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
2f9e0 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2f9f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
2fa00 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
2fa10 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2fa20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
2fa30 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
2fa40 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
2fa50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2fa60 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2fa70 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
2fa80 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2fa90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2faa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2fab0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2fac0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2fad0 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
2fae0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
2faf0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
2fb00 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2fb10 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2fb20 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
2fb30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
2fb40 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
2fb50 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a 20 20 20  r->tempFile .   
2fb60 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 70 42    && (pPager->pB
2fb70 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
2fb80 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
2fb90 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2fba0 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  >0) .    ){.    
2fbb0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
2fbc0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
2fbd0 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
2fbe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fbf0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
2fc00 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
2fc10 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
2fc20 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
2fc30 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
2fc40 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
2fc50 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
2fc60 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
2fc70 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
2fc80 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2fc90 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
2fca0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
2fcb0 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
2fcc0 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
2fcd0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
2fce0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
2fcf0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
2fd00 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
2fd10 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
2fd20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
2fd30 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2fd40 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
2fd50 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
2fd60 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
2fd70 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
2fd80 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
2fd90 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
2fda0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
2fdb0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
2fdc0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
2fdd0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
2fde0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
2fdf0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
2fe00 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
2fe10 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
2fe20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
2fe30 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
2fe40 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
2fe50 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
2fe60 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
2fe70 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
2fe80 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
2fe90 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
2fea0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
2feb0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
2fec0 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
2fed0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
2fee0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
2fef0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
2ff00 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
2ff10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2ff20 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2ff30 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
2ff40 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
2ff50 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
2ff60 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
2ff70 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
2ff80 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
2ff90 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
2ffa0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
2ffb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ffc0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
2ffd0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
2ffe0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
2fff0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
30000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30020 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
30030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
30040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
30050 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
30060 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
30070 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
30080 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
30090 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
300a0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
300b0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
300c0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
300d0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
300e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
300f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
30100 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
30110 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
30120 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
30130 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
30140 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
30150 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
30160 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
30170 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
30180 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
30190 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
301a0 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
301b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
301c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
301d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
301e0 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
301f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
30200 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
30210 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
30220 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
30230 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
30240 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
30250 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
30260 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
30270 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
30280 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
30290 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  EN && rc==SQLITE
302a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
302b0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
302c0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
302d0 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66  dbSize);.  }.. f
302e0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
302f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30300 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
30310 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   );.    pager_un
30320 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
30330 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30340 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30350 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  OPEN );.  }else{
30360 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
30370 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
30380 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
30390 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
303a0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
303b0 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64  ount has reached
303c0 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20   zero, rollback 
303d0 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72  any active.** tr
303e0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e  ansaction and un
303f0 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
30400 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e  **.** Except, in
30410 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
30420 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65  CLUSIVE when the
30430 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
30440 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62   in.** the rollb
30450 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ack journal, the
30460 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70   unlock is not p
30470 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65  erformed and the
30480 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67  re is.** nothing
30490 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f   to rollback, so
304a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
304b0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74   a no-op..*/ .st
304c0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
304d0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
304e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
304f0 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63  if( (sqlite3Pcac
30500 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
30510 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
30520 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
30530 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
30540 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
30550 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
30560 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
30570 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
30580 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
30590 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
305a0 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
305b0 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
305c0 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
305d0 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
305e0 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
305f0 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
30600 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
30610 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
30620 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
30630 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
30640 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
30650 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
30660 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
30670 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
30680 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
30690 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
306a0 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
306b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
306c0 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
306d0 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
306e0 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
306f0 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
30700 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
30710 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
30720 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
30730 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
30740 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
30750 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
30760 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
30770 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
30780 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
30790 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
307a0 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
307b0 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
307c0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
307d0 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
307e0 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
307f0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
30800 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
30810 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30820 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
30830 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
30840 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
30850 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
30860 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
30870 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
30880 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
30890 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
308a0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
308b0 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
308c0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
308d0 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
308e0 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
308f0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
30900 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
30910 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
30920 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
30930 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
30940 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
30950 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
30960 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
30970 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
30980 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
30990 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
309a0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
309b0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
309c0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
309d0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
309e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
309f0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
30a00 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
30a10 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69  seperate scenari
30a20 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
30a30 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
30a40 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
30a50 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
30a60 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
30a70 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
30a80 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
30a90 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
30aa0 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
30ab0 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
30ac0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
30ad0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
30ae0 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
30af0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
30b00 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
30b10 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
30b20 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
30b30 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
30b40 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
30b50 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
30b60 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
30b70 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
30b80 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
30b90 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
30ba0 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
30bb0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
30bc0 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
30bd0 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
30be0 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
30bf0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
30c00 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
30c10 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
30c20 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
30c30 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
30c40 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
30c50 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
30c60 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
30c70 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
30c80 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
30c90 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
30ca0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30cb0 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
30cc0 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
30cd0 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
30ce0 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
30cf0 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
30d00 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
30d10 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
30d20 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
30d30 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
30d40 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
30d50 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
30d60 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
30d70 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
30d80 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
30d90 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
30da0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
30db0 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
30dc0 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
30dd0 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
30de0 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
30df0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
30e00 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
30e10 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
30e20 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
30e30 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
30e40 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
30e50 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
30e60 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
30e70 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
30e80 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
30e90 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
30ea0 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
30eb0 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
30ec0 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
30ed0 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
30ee0 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
30ef0 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
30f00 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
30f10 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
30f20 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
30f30 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
30f40 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
30f50 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
30f60 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
30f70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
30f80 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
30f90 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
30fa0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
30fb0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
30fc0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
30fd0 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
30fe0 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
30ff0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31000 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
31010 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
31020 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
31030 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
31040 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
31050 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
31060 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
31070 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
31080 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
31090 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
310a0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
310b0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
310c0 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  er) );..  if( pg
310d0 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
310e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
310f0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
31100 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
31110 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
31120 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
31130 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
31140 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
31150 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
31160 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
31170 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
31180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
31190 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
311a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
311b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
311c0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
311d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
311e0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
311f0 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
31200 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
31210 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31220 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
31230 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
31240 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
31250 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
31260 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
31270 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
31280 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
31290 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
312a0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
312b0 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
312c0 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
312d0 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
312e0 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
312f0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
31300 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
31310 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
31320 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
31330 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
31340 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
31350 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
31360 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
31370 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
31380 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
31390 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
313a0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
313b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
313c0 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
313d0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
313e0 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
313f0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
31400 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
31410 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
31420 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
31430 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
31440 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
31450 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
31460 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
31470 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nHit++;.    retu
31480 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
31490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
314a0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
314b0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
314c0 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
314d0 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
314e0 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
314f0 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67  ed.  */..    pPg
31500 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20   = *ppPage;.    
31510 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
31520 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ager;..    /* Th
31530 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
31540 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
31550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
31560 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
31570 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65     ** number gre
31580 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
31590 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f  or the unused lo
315a0 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72  cking-page, is r
315b0 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20  equested. */.   
315c0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
315d0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
315e0 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
315f0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
31600 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
31610 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
31620 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
31630 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
31640 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c      if( MEMDB ||
31650 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
31660 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
31670 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  t || !isOpen(pPa
31680 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
31690 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
316a0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
316b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
316c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67  _FULL;.        g
316d0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
316e0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
316f0 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
31700 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
31710 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
31720 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
31730 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
31740 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
31750 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
31760 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
31770 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
31780 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
31790 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
317a0 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
317b0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
317c0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
317d0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
317e0 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
317f0 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
31800 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
31810 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
31820 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
31830 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
31840 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
31850 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
31860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31870 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
31880 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
31890 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
318a0 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
318b0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
318c0 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
318d0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
318e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
318f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
31900 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
31910 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
31920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
31930 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
31940 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
31950 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
31960 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
31970 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
31980 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
31990 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
319a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
319b0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
319c0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
319d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
319e0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
319f0 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
31a00 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
31a10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31a20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
31a30 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
31a40 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
31a50 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 20 20 72  nMiss++;.      r
31a60 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
31a70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
31a80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31a90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
31aa0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
31ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31ac0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
31ad0 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  hash(pPg);.  }..
31ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31af0 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
31b00 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
31b10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31b20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
31b30 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
31b40 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
31b50 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
31b60 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a  nused(pPager);..
31b70 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
31b80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31b90 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
31ba0 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
31bb0 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
31bc0 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
31bd0 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
31be0 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
31bf0 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
31c00 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
31c10 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
31c20 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
31c30 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20  che. .**.** See 
31c40 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
31c50 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
31c60 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
31c70 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
31c80 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
31c90 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
31ca0 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
31cb0 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
31cc0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
31cd0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
31ce0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
31cf0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
31d00 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
31d10 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
31d20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
31d30 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
31d40 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
31d50 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
31d60 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
31d70 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
31d80 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
31d90 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
31da0 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
31db0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
31dc0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
31dd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
31de0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
31df0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
31e00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
31e10 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
31e20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
31e30 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
31e40 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
31e50 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
31e60 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
31e70 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
31e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
31e90 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
31ea0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
31eb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
31ec0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
31ed0 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
31ee0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
31ef0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
31f00 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
31f10 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
31f20 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
31f30 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
31f40 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
31f50 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
31f60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
31f70 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
31f80 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
31f90 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
31fa0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
31fb0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
31fc0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
31fd0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
31fe0 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
31ff0 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
32000 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
32010 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
32020 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
32030 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
32040 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
32050 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
32060 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
32070 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
32080 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
32090 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
320a0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
320b0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
320c0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
320d0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
320e0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
320f0 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
32100 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
32110 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
32120 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
32130 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
32140 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
32150 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
32160 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
32170 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
32180 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
32190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
321a0 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
321b0 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
321c0 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
321d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
321e0 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
321f0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
32200 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
32210 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
32220 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
32230 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
32240 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
32250 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
32260 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
32270 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
32280 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
32290 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
322a0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
322b0 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
322c0 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
322d0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
322e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
322f0 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
32300 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
32310 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
32320 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
32330 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
32340 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
32350 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
32360 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
32370 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
32380 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
32390 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
323a0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
323b0 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
323c0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
323d0 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
323e0 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
323f0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
32400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
32410 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
32420 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
32430 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
32440 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
32450 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
32460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32470 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
32480 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
32490 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
324a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
324b0 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
324c0 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
324d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
324e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
324f0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
32500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
32510 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
32520 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
32530 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
32540 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
32550 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
32560 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
32570 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
32580 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
32590 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
325a0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
325b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
325c0 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
325d0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
325e0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
325f0 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
32600 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
32610 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
32620 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
32630 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
32640 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
32650 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
32660 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
32670 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70  ODE_OFF ){.    p
32680 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
32690 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
326a0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
326b0 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  dbSize);.    if(
326c0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
326d0 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
326e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
326f0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  MEM;.    }.  .  
32700 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
32710 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
32720 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
32730 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  open. */.    if(
32740 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
32750 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
32760 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
32770 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
32780 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
32790 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
327a0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
327b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
327c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
327d0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
327e0 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
327f0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
32800 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
32810 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 23 69  urnal file */.#i
32820 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
32830 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
32840 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
32850 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
32860 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
32870 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65  ECTION_MASK)|.#e
32880 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 53  ndif.          S
32890 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
328a0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
328b0 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
328c0 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
328d0 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
328e0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
328f0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
32900 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
32910 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
32920 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
32930 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
32940 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
32950 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
32960 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
32970 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  E.        rc = s
32980 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
32990 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  n(.            p
329a0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
329b0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
329c0 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
329d0 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
329e0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23  ).        );.  #
329f0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20  else.        rc 
32a00 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
32a10 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32a20 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32a30 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
32a40 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d    #endif.      }
32a50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
32a60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
32a70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32a80 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  fd) );.    }.  .
32a90 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
32aa0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
32ab0 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
32ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
32ad0 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   open .    ** th
32ae0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
32af0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
32b00 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
32b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32b20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
32b30 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
32b40 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
32b50 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ired. */.      p
32b60 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
32b70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
32b80 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
32b90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
32ba0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
32bb0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32bc0 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lHdr = 0;.      
32bd0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
32be0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
32bf0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
32c00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32c10 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
32c20 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
32c30 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
32c40 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
32c50 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rnal = 0;.  }els
32c60 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
32c70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32c80 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
32c90 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ED );.    pPager
32ca0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
32cb0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
32cc0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
32cd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
32ce0 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
32cf0 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
32d00 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
32d10 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
32d20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
32d30 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
32d40 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
32d50 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
32d60 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
32d70 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
32d80 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
32d90 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
32da0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
32db0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
32dc0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
32dd0 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
32de0 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
32df0 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
32e00 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
32e10 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
32e20 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
32e30 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
32e40 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
32e50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
32e60 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
32e70 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
32e80 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a  , then any sub-j
32e90 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a  ournal opened.**
32ea0 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
32eb0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
32ec0 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
32ed0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68  -memory file. Th
32ee0 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66  is.** has no eff
32ef0 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a  ect if the sub-j
32f00 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64  ournal is alread
32f10 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20  y opened (as it 
32f20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72  may be when.** r
32f30 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
32f40 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20  ive mode) or if 
32f50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
32f60 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
32f70 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61   a.** sub-journa
32f80 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  l. If the subjIn
32f90 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
32fa0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  is zero, then an
32fb0 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75  y required.** su
32fc0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70  b-journal is imp
32fd0 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f  lemented in-memo
32fe0 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20  ry if pPager is 
32ff0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
33000 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73  abase, .** or us
33010 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ing a temporary 
33020 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  file otherwise..
33030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33040 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
33050 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
33060 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65  ag, int subjInMe
33070 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  mory){.  int rc 
33080 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
33090 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
330a0 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61  ode ) return pPa
330b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
330c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
330d0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
330e0 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e  ADER && pPager->
330f0 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52  eState<PAGER_ERR
33100 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OR );.  pPager->
33110 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
33120 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
33130 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
33140 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33150 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a  AGER_READER) ){.
33160 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33170 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
33180 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  0 );..    if( pa
33190 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
331a0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
331b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
331c0 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
331d0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
331e0 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
331f0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
33200 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
33210 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
33220 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
33230 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
33240 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
33250 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
33260 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
33270 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
33280 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
33290 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
332a0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
332b0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
332c0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
332d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
332e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
332f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
33300 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
33310 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
33320 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
33330 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
33340 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
33350 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
33360 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
33370 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
33380 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
33390 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
333a0 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
333b0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
333c0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
333d0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
333e0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
333f0 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
33400 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
33410 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
33420 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
33430 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
33440 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
33450 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
33460 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
33470 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
33480 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
33490 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
334a0 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
334b0 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
334c0 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
334d0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
334e0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
334f0 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
33500 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
33510 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
33520 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
33530 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
33540 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
33550 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
33560 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
33570 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
33580 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
33590 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
335a0 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
335b0 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
335c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
335d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
335e0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
335f0 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
33600 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
33610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
33620 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
33630 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
33640 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
33650 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
33660 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
33670 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
33680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33690 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
336a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
336b0 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
336c0 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
336d0 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
336e0 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
336f0 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
33700 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
33710 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
33720 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
33730 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
33740 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
33750 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
33760 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
33770 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
33780 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
33790 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
337a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
337b0 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
337c0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
337d0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
337e0 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
337f0 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
33800 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
33810 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
33820 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
33830 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
33840 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33850 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
33860 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
33870 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
33880 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
33890 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
338a0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
338b0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
338c0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
338d0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
338e0 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
338f0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
33900 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
33910 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
33920 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
33930 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
33940 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
33950 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
33960 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
33970 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
33980 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33990 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
339a0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
339b0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
339c0 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
339d0 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
339e0 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
339f0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
33a00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
33a10 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
33a20 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
33a30 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
33a40 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
33a50 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
33a60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
33a70 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
33a80 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
33a90 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
33aa0 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
33ab0 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
33ac0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
33ad0 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
33ae0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
33af0 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
33b00 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
33b10 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
33b20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
33b30 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
33b40 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
33b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33b60 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
33b70 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
33b80 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
33b90 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
33ba0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
33bb0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
33bc0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
33bd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
33be0 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
33bf0 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
33c00 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
33c10 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
33c20 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
33c30 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
33c40 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
33c50 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
33c60 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
33c70 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
33c80 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
33c90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33ca0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
33cb0 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
33cc0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
33cd0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
33ce0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
33cf0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
33d00 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
33d10 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
33d20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33d30 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33d40 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
33d50 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  n error has been
33d60 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65   previously dete
33d70 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65  cted, report the
33d80 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a   same error.  **
33d90 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f   again. This sho
33da0 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20  uld not happen, 
33db0 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70 72  but the check pr
33dc0 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73  ovides robustnes
33dd0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
33de0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
33df0 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
33e00 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
33e10 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
33e20 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
33e30 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
33e40 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
33e50 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
33e60 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
33e70 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
33e80 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
33e90 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
33ea0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
33eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
33ec0 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  RM;..  CHECK_PAG
33ed0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  E(pPg);..  /* Th
33ee0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
33ef0 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65  eeds to be opene
33f00 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20  d. Higher level 
33f10 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c  routines have al
33f20 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69  ready.  ** obtai
33f30 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  ned the necessar
33f40 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e  y locks to begin
33f50 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
33f60 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a  action, but the.
33f70 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
33f80 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
33f90 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65  yet be open. Ope
33fa0 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73  n it now if this
33fb0 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
33fc0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
33fd0 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  done before call
33fe0 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
33ff0 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20  eMakeDirty() on 
34000 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20  the page. .  ** 
34010 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74  Otherwise, if it
34020 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72   were done after
34030 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
34040 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
34050 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20  ), then.  ** an 
34060 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75  error might occu
34070 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  r and the pager 
34080 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20  would end up in 
34090 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
340a0 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61  ate.  ** with pa
340b0 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69  ges marked as di
340c0 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  rty in the cache
340d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
340e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
340f0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
34100 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
34110 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
34120 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
34130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34140 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
34150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34160 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
34170 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
34180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
34190 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
341a0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
341b0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
341c0 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
341d0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
341e0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
341f0 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
34200 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
34210 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
34220 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
34230 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
34240 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
34250 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
34260 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  & !subjRequiresP
34270 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
34280 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
34290 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
342a0 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
342b0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
342c0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
342d0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
342e0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
342f0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
34300 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
34310 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
34320 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
34330 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
34340 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
34350 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
34360 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
34370 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
34380 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
34390 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
343a0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
343b0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
343c0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
343d0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
343e0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
343f0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
34400 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65  rigSize && isOpe
34410 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
34420 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
34430 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
34440 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20  r *pData2;.     
34450 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50     i64 iOff = pP
34460 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
34470 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
34480 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
34490 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
344a0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
344b0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
344c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
344d0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
344e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
344f0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
34500 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
34510 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
34520 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
34530 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
34540 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
34550 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34560 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
34570 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
34580 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
34590 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
345a0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
345b0 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
345c0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
345d0 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
345e0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
345f0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
34600 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ta2);..        /
34610 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
34620 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
34630 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a  r occurs while j
34640 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
34650 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
34660 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
34670 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
34680 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
34690 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
346a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
346b0 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
346c0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
346d0 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
346e0 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
346f0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
34700 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
34710 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
34720 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
34730 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
34740 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
34750 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
34760 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
34770 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
34780 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
34790 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
347a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
347b0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
347c0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
347d0 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ..        rc = w
347e0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
347f0 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50  r->jfd, iOff, pP
34800 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
34810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34820 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
34830 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34840 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
34850 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
34860 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34870 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20  ze, iOff+4);.   
34880 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34890 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
348a0 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
348b0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
348c0 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
348d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
348e0 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  4, cksum);.     
348f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34900 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
34910 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ;..        IOTRA
34920 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
34930 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
34940 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
34950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34960 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
34970 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
34980 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
34990 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
349a0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
349b0 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
349c0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
349d0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
349e0 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
349f0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
34a00 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
34a10 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
34a20 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
34a30 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
34a40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
34a50 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
34a60 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
34a70 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
34a80 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
34a90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34aa0 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
34ab0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
34ac0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34ad0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
34ae0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
34af0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
34b00 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
34b10 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
34b20 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
34b30 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
34b40 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34b50 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
34b60 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
34b70 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
34b80 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
34b90 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
34ba0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
34bb0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
34bc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
34be0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
34bf0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34c00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
34c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
34c20 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
34c30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
34c40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
34c50 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OD ){.          
34c60 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
34c70 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
34c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34c90 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
34ca0 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
34cb0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
34cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cd0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
34ce0 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
34cf0 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
34d00 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
34d10 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
34d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34d30 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
34d40 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
34d50 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
34d60 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
34d70 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
34d80 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
34d90 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
34da0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
34db0 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
34dc0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
34dd0 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
34de0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
34df0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
34e00 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
34e10 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
34e20 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
34e30 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
34e40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
34e50 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
34e60 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
34e70 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
34e80 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
34e90 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
34ea0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
34eb0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
34ec0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
34ed0 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
34ee0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
34ef0 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
34f00 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
34f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
34f20 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
34f30 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
34f40 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
34f50 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
34f60 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
34f70 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
34f80 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
34f90 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
34fa0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
34fb0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
34fc0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
34fd0 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
34fe0 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
34ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
35000 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
35010 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
35020 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
35030 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
35040 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
35050 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
35060 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
35070 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
35080 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
35090 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
350a0 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
350b0 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
350c0 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
350d0 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
350e0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
350f0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
35100 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
35110 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
35120 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
35130 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
35140 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
35150 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
35160 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
35170 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
35180 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
35190 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
351a0 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
351b0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
351c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
351d0 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
351e0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
351f0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
35200 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
35210 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
35220 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
35230 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
35240 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72  eSize);..  asser
35250 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
35260 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
35270 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
35280 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35290 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
352a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
352b0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
352c0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
352d0 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ( nPagePerSector
352e0 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
352f0 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
35300 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
35310 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
35320 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
35330 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
35340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35350 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
35360 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
35370 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
35380 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  .    int nPage =
35390 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
353a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
353b0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
353c0 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
353d0 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
353e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
353f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
35400 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
35410 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  c = 0;         /
35420 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
35430 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
35440 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f  D_SYNC */..    /
35450 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
35460 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f  yncSpill flag to
35470 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
35480 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
35490 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75  low.    ** a jou
354a0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62  rnal header to b
354b0 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
354c0 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
354d0 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  naled by.    ** 
354e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  this function.. 
354f0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
35500 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
35510 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35520 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
35530 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
35540 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b  >doNotSyncSpill+
35550 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  +;..    /* This 
35560 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
35570 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
35580 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
35590 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
355a0 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
355b0 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
355c0 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
355d0 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
355e0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
355f0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
35600 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
35610 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
35620 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
35630 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
35640 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
35650 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
35660 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64  ount = pPager->d
35670 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70  bSize;.    if( p
35680 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
35690 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
356a0 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
356b0 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
356c0 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
356d0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
356e0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
356f0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
35700 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
35710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
35720 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
35730 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
35740 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
35750 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
35760 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
35770 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
35780 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
35790 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
357a0 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
357b0 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
357c0 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
357d0 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
357e0 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
357f0 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
35800 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
35810 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
35820 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
35830 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
35840 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
35850 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
35860 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
35870 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
35880 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
35890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
358a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
358b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
358c0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
358d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
358e0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
358f0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
35900 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
35910 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
35920 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
35930 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
35940 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
35950 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35960 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35970 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
35980 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
35990 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
359a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
359b0 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
359c0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
359d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
359e0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
359f0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
35a00 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
35a10 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
35a20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
35a30 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
35a40 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  NC flag is set f
35a50 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
35a60 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
35a70 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
35a80 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
35a90 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
35aa0 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
35ab0 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
35ac0 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
35ad0 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
35ae0 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
35af0 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
35b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
35b10 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
35b20 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
35b30 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
35b40 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
35b50 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
35b60 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
35b70 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
35b80 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
35b90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65  SQLITE_OK && nee
35ba0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
35bb0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
35bc0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
35bd0 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29   ii<nPage; ii++)
35be0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
35bf0 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
35c00 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
35c10 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
35c20 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
35c30 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61        pPage->fla
35c40 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
35c50 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
35c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35c70 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
35c80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35c90 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
35ca0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
35cb0 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  cSpill==1 );.   
35cc0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
35cd0 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c  ncSpill--;.  }el
35ce0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
35cf0 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
35d00 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
35d10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
35d20 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
35d30 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
35d40 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
35d50 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
35d60 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
35d70 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
35d80 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
35d90 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
35da0 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
35db0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
35dc0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
35dd0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
35de0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
35df0 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
35e00 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
35e10 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
35e20 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66  _DIRTY;.}.#endif
35e30 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
35e40 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
35e50 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
35e60 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
35e70 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
35e80 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
35e90 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
35ea0 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
35eb0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
35ec0 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
35ed0 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
35ee0 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65  rty.  This happe
35ef0 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
35f00 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67   when.** the pag
35f10 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64  e has been added
35f20 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68   as a leaf of th
35f30 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73  e freelist and s
35f40 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o its.** content
35f50 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65   no longer matte
35f60 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  rs..**.** The ov
35f70 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
35f80 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
35f90 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
35fa0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
35fb0 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
35fc0 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54  age is unused. T
35fd0 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
35fe0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
35ff0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
36000 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
36010 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
36020 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
36030 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
36040 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70  tion can quadrup
36050 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
36060 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45  large .** DELETE
36070 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
36080 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
36090 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72  rDontWrite(PgHdr
360a0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
360b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
360c0 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50  Pager;.  if( (pP
360d0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
360e0 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d  IRTY) && pPager-
360f0 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  >nSavepoint==0 )
36100 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
36110 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  (("DONT_WRITE pa
36120 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
36130 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
36140 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
36150 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
36160 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
36170 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
36180 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
36190 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  = PGHDR_DONT_WRI
361a0 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  TE;.    pager_se
361b0 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
361c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
361d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
361e0 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
361f0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
36200 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36210 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
36220 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
36230 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
36240 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
36250 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
36260 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
36270 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68   pager file.  Th
36280 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e  e secondary chan
36290 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a  ge counter at.**
362a0 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61   92 is also upda
362b0 74 65 64 2c 20 61 73 20 69 73 20 74 68 65 20 53  ted, as is the S
362c0 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
362d0 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
362e0 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69  6..**.** But thi
362f0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
36300 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  f the pPager->ch
36310 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
36320 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20  ag is false..** 
36330 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73 20  To avoid excess 
36340 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65  churning of page
36350 20 31 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f   1, the update o
36360 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65  nly happens once
36370 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68  ..** See also th
36380 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  e pager_write_ch
36390 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72 6f  angecounter() ro
363a0 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
363b0 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69  an .** unconditi
363c0 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20 74  onal update of t
363d0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
363e0 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
363f0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
36400 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  ag is zero, then
36410 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   this is done by
36420 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
36430 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
36440 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e   on page 1, then
36450 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
36460 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
36470 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20  * page data. In 
36480 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69  this case the fi
36490 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74  le will be updat
364a0 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ed when the curr
364b0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
364c0 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
364d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72  .**.** The isDir
364e0 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79  ectMode flag may
364f0 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72   only be non-zer
36500 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  o if the library
36510 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a   was compiled.**
36520 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
36530 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
36540 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e  RITE macro defin
36550 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
36560 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74  ,.** if isDirect
36570 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
36580 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
36590 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
365a0 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77  directly.** by w
365b0 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65  riting an update
365c0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  d version of pag
365d0 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  e 1 using a call
365e0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   to the .** sqli
365f0 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e  te3OsWrite() fun
36600 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
36610 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
36620 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
36630 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
36640 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a   isDirectMode){.
36650 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36660 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
36670 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36680 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
36690 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
366a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
366b0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
366c0 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
366d0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
366e0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
366f0 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61  ..  /* Declare a
36700 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  nd initialize co
36710 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27  nstant integer '
36720 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68  isDirect'. If th
36730 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  e.  ** atomic-wr
36740 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
36750 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74   is enabled in t
36760 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  his build, then 
36770 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73  isDirect.  ** is
36780 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
36790 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
367a0 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74   as the isDirect
367b0 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20  Mode parameter. 
367c0 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63   ** to this func
367d0 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
367e0 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65   it is always se
367f0 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  t to zero..  **.
36800 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73    ** The idea is
36810 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f   that if the ato
36820 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
36830 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  zation is not.  
36840 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ** enabled at co
36850 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20  mpile time, the 
36860 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69  compiler can omi
36870 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20  t the tests of. 
36880 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62   ** 'isDirect' b
36890 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73  elow, as well as
368a0 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f   the block enclo
368b0 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
368c0 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22  "if( isDirect )"
368d0 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f   condition..  */
368e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
368f0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
36900 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52  ITE.# define DIR
36910 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73  ECT_MODE 0.  ass
36920 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64  ert( isDirectMod
36930 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  e==0 );.  UNUSED
36940 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72  _PARAMETER(isDir
36950 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  ectMode);.#else.
36960 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
36970 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64  MODE isDirectMod
36980 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
36990 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
369a0 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67  ountDone && pPag
369b0 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
369c0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
369d0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
369e0 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74    /* Reference t
369f0 6f 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 20  o page 1 */..   
36a00 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
36a10 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73  ->tempFile && is
36a20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
36a30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
36a40 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
36a50 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
36a60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
36a70 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
36a80 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
36a90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
36aa0 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  gHdr==0 || rc==S
36ab0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
36ac0 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20   /* If page one 
36ad0 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63  was fetched succ
36ae0 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68  essfully, and th
36af0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
36b00 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  ot.    ** operat
36b10 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f  ing in direct-mo
36b20 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20  de, make page 1 
36b30 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20  writable.  When 
36b40 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64  not in .    ** d
36b50 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65  irect mode, page
36b60 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c   1 is always hel
36b70 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68  d in cache and h
36b80 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65  ence the PagerGe
36b90 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  t().    ** above
36ba0 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65   is always succe
36bb0 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68  ssful - hence th
36bc0 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d  e ALWAYS on rc==
36bd0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a  SQLITE_OK..    *
36be0 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43  /.    if( !DIREC
36bf0 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53  T_MODE && ALWAYS
36c00 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
36c10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
36c20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36c30 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
36c40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
36c60 2a 20 41 63 74 75 61 6c 6c 79 20 64 6f 20 74 68  * Actually do th
36c70 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
36c80 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a  change counter *
36c90 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 77 72  /.      pager_wr
36ca0 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
36cb0 72 28 70 50 67 48 64 72 29 3b 0a 0a 20 20 20 20  r(pPgHdr);..    
36cc0 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20    /* If running 
36cd0 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  in direct mode, 
36ce0 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
36cf0 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  ts of page 1 to 
36d00 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
36d10 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f     if( DIRECT_MO
36d20 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  DE ){.        co
36d30 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a  nst void *zBuf;.
36d40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36d50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
36d60 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ze>0 );.        
36d70 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
36d80 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c  PgHdr->pData, 1,
36d90 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   6, rc=SQLITE_NO
36da0 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  MEM, zBuf);.    
36db0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36dc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36dd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
36de0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
36df0 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
36e00 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
36e10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36e20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36e30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36e40 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
36e50 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
36e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
36e70 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67  se{.        pPag
36e80 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
36e90 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
36ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
36eb0 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
36ec0 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
36ed0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36ee0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
36ef0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36f00 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
36f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
36f20 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61   disk. This is a
36f30 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65   no-op for in-me
36f40 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 0a 2a  mory databases.*
36f50 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20  * or pages with 
36f60 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
36f70 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
36f80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
36f90 6f 72 20 69 66 20 63 61 6c 6c 65 64 20 6f 6e 20  or if called on 
36fa0 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  a pager for whic
36fb0 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  h it is a no-op,
36fc0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
36fd0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
36fe0 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
36ff0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
37000 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
37010 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37020 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
37030 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
37040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
37050 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
37060 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
37070 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 72   !MEMDB );.    r
37080 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
37090 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
370a0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
370b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
370c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
370d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
370e0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 73 71  !MEMDB );.    sq
370f0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
37100 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
37110 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43  QLITE_FCNTL_SYNC
37120 5f 4f 4d 49 54 54 45 44 2c 20 28 76 6f 69 64 20  _OMITTED, (void 
37130 2a 29 26 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  *)&rc);.  }.  re
37140 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37150 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
37160 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
37170 65 64 20 77 68 69 6c 65 20 61 20 77 72 69 74 65  ed while a write
37180 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
37190 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c  active in.** rol
371a0 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63 6f  lback. If the co
371b0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57  nnection is in W
371c0 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  AL mode, this ca
371d0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a  ll is a no-op. .
371e0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
371f0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
37200 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
37210 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53 49   have an EXCLUSI
37220 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74  VE lock on .** t
37230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37240 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  , an attempt is 
37250 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f  made to obtain o
37260 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ne..**.** If the
37270 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
37280 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
37290 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  or the attempt t
372a0 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a 2a  o obtain it is.*
372b0 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  * successful, or
372c0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
372d0 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20  is in WAL mode, 
372e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
372f0 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  urned..** Otherw
37300 69 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49  ise, either SQLI
37310 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53 51  TE_BUSY or an SQ
37320 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
37330 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
37340 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
37350 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  t sqlite3PagerEx
37360 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67 65  clusiveLock(Page
37370 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
37380 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
373a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
373b0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
373c0 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  D .       || pPa
373d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
373e0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
373f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
37400 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37410 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a  _WRITER_LOCKED .
37420 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
37430 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
37440 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69  e(pPager) );.  i
37450 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57 61  f( 0==pagerUseWa
37460 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
37470 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
37480 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
37490 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
374a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
374b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
374c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
374d0 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
374e0 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
374f0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
37500 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
37510 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
37520 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
37530 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
37540 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
37550 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
37560 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
37570 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
37580 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
37590 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
375a0 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
375b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
375c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
375d0 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a  e ensures that:.
375e0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  **.**   * The da
375f0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
37600 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70  ge-counter is up
37610 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68  dated,.**   * th
37620 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
37630 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20  ced (unless the 
37640 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
37650 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
37660 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64  d),.**   * all d
37670 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77  irty pages are w
37680 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
37690 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a  tabase file, .**
376a0 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
376b0 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  e file is trunca
376c0 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64  ted (if required
376d0 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  ), and.**   * th
376e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
376f0 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  synced. .**.** T
37700 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
37710 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  at remains to co
37720 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
37730 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c  tion is to final
37740 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c  ize .** (delete,
37750 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
37760 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  o the first part
37770 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c   of) the journal
37780 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65   file (or .** de
37790 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
377a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
377b0 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
377c0 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
377d0 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
377e0 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
377f0 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
37800 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
37810 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
37820 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
37830 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
37840 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
37850 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
37860 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
37870 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37880 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
37890 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
378a0 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
378b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
378c0 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
378d0 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
378e0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
378f0 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
37900 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
37910 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
37920 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
37930 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
37940 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
37950 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
37960 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
37970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
37980 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
37990 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
379a0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
379b0 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  * If not NULL, t
379c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
379d0 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  l name */.  int 
379e0 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  noSync          
379f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
37a00 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  rue to omit the 
37a10 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20  xSync on the db 
37a20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
37a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37a50 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
37a60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37a70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37a80 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
37a90 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37aa0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37ab0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
37ac0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37ad0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37ae0 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20  ITER_DBMOD.     
37af0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37b00 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
37b10 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
37b20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37b30 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
37b40 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65   /* If a prior e
37b50 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72  rror occurred, r
37b60 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72  eport that error
37b70 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28   again. */.  if(
37b80 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
37b90 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
37ba0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
37bb0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
37bc0 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
37bd0 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
37be0 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c  =%s nSize=%d\n",
37bf0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
37c00 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
37c10 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
37c20 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  ze));..  /* If n
37c30 6f 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  o database chang
37c40 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  es have been mad
37c50 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e  e, return early.
37c60 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
37c70 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
37c80 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
37c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37ca0 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  K;..  if( MEMDB 
37cb0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
37cc0 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
37cd0 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
37ce0 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
37cf0 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
37d00 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
37d10 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
37d20 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d   called, it is m
37d30 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20  ostly a no-op.  
37d40 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20  However, any.   
37d50 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72   ** backup in pr
37d60 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20  ogress needs to 
37d70 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
37d80 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
37d90 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
37da0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
37db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
37dc0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
37dd0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67  ger) ){.      Pg
37de0 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  Hdr *pList = sql
37df0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
37e00 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
37e10 63 68 65 29 3b 0a 20 20 20 20 20 20 50 67 48 64  che);.      PgHd
37e20 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30 3b  r *pPageOne = 0;
37e30 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
37e40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
37e50 2a 20 4d 75 73 74 20 68 61 76 65 20 61 74 20 6c  * Must have at l
37e60 65 61 73 74 20 6f 6e 65 20 70 61 67 65 20 66 6f  east one page fo
37e70 72 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69 74  r the WAL commit
37e80 20 66 6c 61 67 2e 0a 20 20 20 20 20 20 20 20 2a   flag..        *
37e90 2a 20 54 69 63 6b 65 74 20 5b 32 64 31 61 35 63  * Ticket [2d1a5c
37ea0 36 37 64 66 63 32 33 36 33 65 34 34 66 32 39 64  67dfc2363e44f29d
37eb0 39 62 62 64 35 37 66 5d 20 32 30 31 31 2d 30 35  9bbd57f] 2011-05
37ec0 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  -18 */.        r
37ed0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37ee0 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
37ef0 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20  pPageOne);.     
37f00 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 67 65     pList = pPage
37f10 4f 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  One;.        pLi
37f20 73 74 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  st->pDirty = 0;.
37f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
37f40 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
37f50 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
37f60 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
37f70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
37f80 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
37f90 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61  ager, pList, pPa
37fa0 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20  ger->dbSize, 1, 
37fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
37fc0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f  ager->fullSync ?
37fd0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
37fe0 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  gs : 0).        
37ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
38000 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
38010 65 66 28 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20  ef(pPageOne);.  
38020 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
38040 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
38050 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
38060 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d  PCache);.      }
38070 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
38080 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
38090 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
380a0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
380b0 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
380c0 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65   it.      ** doe
380d0 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
380e0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
380f0 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
38100 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
38110 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61        ** was ena
38120 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
38130 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69  time, and if thi
38140 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65  s transaction me
38150 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ets the .      *
38160 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72  * runtime criter
38170 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70  ia to use the op
38180 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20  eration: .      
38190 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  **.      **    *
381a0 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
381b0 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
381c0 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
381d0 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  rty for.      **
381e0 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
381f0 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
38200 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20  and .      **   
38210 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
38220 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
38230 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
38240 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
38250 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
38260 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
38270 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
38280 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
38290 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
382a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
382b0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
382c0 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65  n was not enable
382d0 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
382e0 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  e, then the.    
382f0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
38300 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
38310 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
38320 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
38330 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a   change.      **
38340 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
38350 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
38360 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
38370 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
38380 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  but.      ** is 
38390 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
383a0 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
383b0 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
383c0 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
383d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65        ** to make
383e0 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
383f0 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
38400 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
38410 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
38420 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
38430 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
38440 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
38450 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
38460 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a  indirect.      *
38470 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a  * mode. .      *
38480 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  *.      ** Other
38490 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74  wise, if the opt
384a0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74  imization is bot
384b0 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70  h enabled and ap
384c0 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20  plicable,.      
384d0 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67  ** then call pag
384e0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
384f0 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
38500 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
38510 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e  nter.      ** in
38520 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
38530 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
38540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
38550 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
38560 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
38570 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
38580 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  n..      */.  #i
38590 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
385a0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
385b0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
385c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
385d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
385e0 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
385f0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
38600 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
38610 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
38620 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
38630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
38640 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
38650 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
38660 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
38670 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70  ster && isOpen(p
38680 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20  Pager->jfd) .   
38690 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
386a0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
386b0 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
386c0 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  ) .       && pPa
386d0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
386e0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a  ger->dbOrigSize.
386f0 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70         && (0==(p
38700 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
38710 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList