/ Hex Artifact Content
Login

Artifact 984dc40d797d8d822d6ce1d184287600d94a289f:


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 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7ff0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
8000: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
8010: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
8020: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
8030: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
8040: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
8050: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
8060: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
8070: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
8080: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
8090: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
80a0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
80b0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
80c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
80d0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
80e0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
80f0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
8100: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
8110: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
8120: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ta */.  void (*x
8130: 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76  CodecSizeChng)(v
8140: 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f  oid*,int,int); /
8150: 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65  * Notify of page
8160: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f   size changes */
8170: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8180: 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20  Free)(void*);   
8190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
81a0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20  tructor for the 
81b0: 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20  codec */.  void 
81c0: 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20  *pCodec;        
81d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
81e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
81f0: 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f  ec... methods */
8200: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
8210: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
8220: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
8230: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
8240: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
8250: 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  se */.  PCache *
8260: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
8270: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8280: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
8290: 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ect */.#ifndef S
82a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
82b0: 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20   Wal *pWal;     
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  Write-ahead log 
82e0: 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c  used by "journal
82f0: 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20  _mode=wal" */.  
8300: 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20  char *zWal;     
8310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8320: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69  ile name for wri
8330: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a  te-ahead log */.
8340: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
8350: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
8360: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
8370: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8380: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8390: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
83a0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
83b0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
83c0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
83d0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
83e0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
83f0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
8400: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8410: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
8420: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
8430: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8440: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8450: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
8460: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8470: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8490: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
84a0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
84b0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
84c0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
84d0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
84e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
84f0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
8500: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8510: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8520: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8530: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8540: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8550: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8560: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8570: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8580: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8590: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
85a0: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
85b0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
85c0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
85d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
85e0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
85f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8600: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8610: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8620: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8630: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8640: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8650: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8660: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8670: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8680: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8690: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
86a0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
86b0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
86c0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
86d0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
86e0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
86f0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8700: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8710: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8720: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8730: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8740: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8750: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8760: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8770: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8780: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8790: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
87a0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
87b0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
87c0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
87d0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
87e0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
87f0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8800: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8810: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8820: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8830: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8840: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8850: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8860: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8870: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8880: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8890: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
88a0: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
88b0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
88c0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
88d0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
88e0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
88f0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8900: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8910: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8920: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8930: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8940: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8950: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8960: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8970: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8980: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8990: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
89a0: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
89b0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
89c0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
89d0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
89e0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
89f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8a00: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8a10: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8a20: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8a30: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8a40: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8a50: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8a60: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8a70: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
8a80: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
8a90: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
8aa0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
8ab0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
8ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
8ad0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
8ae0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
8af0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
8b00: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
8b10: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
8b20: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8b30: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
8b40: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
8b50: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
8b60: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
8b70: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
8b80: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
8b90: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
8ba0: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
8bb0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
8bc0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
8bd0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
8be0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8bf0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
8c00: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
8c10: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
8c20: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
8c30: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
8c40: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
8c50: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
8c60: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
8c70: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
8c80: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
8c90: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
8ca0: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
8cb0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
8cc0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
8cd0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
8ce0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
8cf0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
8d00: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
8d10: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
8d20: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
8d30: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
8d40: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
8d50: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
8d60: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
8d70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
8d80: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
8d90: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
8da0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
8db0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
8dc0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
8dd0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
8de0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
8df0: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
8e00: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
8e10: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
8e20: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
8e30: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
8e40: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
8e50: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
8e60: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
8e70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
8e80: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
8e90: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
8ea0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
8eb0: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
8ec0: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
8ed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
8ee0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
8ef0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
8f00: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
8f10: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
8f20: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
8f30: 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65 73   this pager uses
8f40: 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c   a write-ahead l
8f50: 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  og instead of th
8f60: 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62  e usual.** rollb
8f70: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68  ack journal. Oth
8f80: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
8f90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8fa0: 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63 20  OMIT_WAL.static 
8fb0: 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c 28  int pagerUseWal(
8fc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8fd0: 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
8fe0: 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65  ->pWal!=0);.}.#e
8ff0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
9000: 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20  erUseWal(x) 0.# 
9010: 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c  define pagerRoll
9020: 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64  backWal(x) 0.# d
9030: 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72  efine pagerWalFr
9040: 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29 20  ames(v,w,x,y,z) 
9050: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9060: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
9070: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
9080: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
9090: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
90a0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
90b0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
90c0: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
90d0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
90e0: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
90f0: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
9100: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9110: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
9120: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
9130: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
9140: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
9150: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
9160: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
9170: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9180: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
9190: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
91a0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
91b0: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
91c0: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
91d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
91e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
91f0: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
9200: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
9210: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
9220: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9230: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
9240: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9250: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9260: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
9270: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9280: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9290: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
92a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
92b0: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
92c0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
92d0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
92e0: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
92f0: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
9300: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
9310: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
9320: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
9330: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
9340: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
9350: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9360: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
9370: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
9380: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
9390: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
93a0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
93b0: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
93c0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
93d0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
93e0: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
93f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9410: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
9420: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9430: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
9440: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
9450: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
9460: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9470: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
9480: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
9490: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
94a0: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
94b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
94c0: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
94d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
94e0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
94f0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9500: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9520: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9530: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9540: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9550: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9560: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9570: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9580: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9590: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
95a0: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
95b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
95c0: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
95d0: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
95e0: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
95f0: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9600: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9610: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9620: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9630: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9640: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9650: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9660: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9670: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9680: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9690: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
96a0: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
96b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
96c0: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
96d0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
96e0: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
96f0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9700: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9710: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9720: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9730: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9750: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9760: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9770: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9780: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9790: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
97a0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
97b0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
97c0: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
97d0: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
97e0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
97f0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9800: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9810: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9820: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9830: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9840: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9850: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9860: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9870: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9880: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9890: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
98a0: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
98b0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
98c0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
98d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
98e0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
98f0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9900: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9910: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9920: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9930: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9940: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9950: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9960: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9970: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9980: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9990: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
99a0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
99b0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
99c0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
99d0: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
99e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
99f0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9a00: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9a10: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9a20: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9a30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9a40: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
9a50: 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c  CK || p->noReadl
9a60: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ock );.      bre
9a70: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9a80: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9a90: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9aa0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9ab0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9ac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ad0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9ae0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9af0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9b00: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9b10: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9b20: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9b30: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9b40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9b50: 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72  ->dbSize==pPager
9b60: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
9b70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9b80: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9b90: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ==pPager->dbFile
9ba0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9bb0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9bc0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9bd0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
9be0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9bf0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
9c00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
9c10: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9c20: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
9c30: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
9c40: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9c50: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9c60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9c70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9c80: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9c90: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ca0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9cb0: 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
9cc0: 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72  ble that if jour
9cd0: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72  nal_mode=wal her
9ce0: 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74  e that neither t
9cf0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
9d00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74  urnal file nor t
9d10: 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20  he WAL file are 
9d20: 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65  open. This happe
9d30: 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20  ns during.      
9d40: 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
9d50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
9d60: 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a   switches from j
9d70: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a  ournal_mode=off.
9d80: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f          ** to jo
9d90: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a  urnal_mode=wal..
9da0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9db0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9dc0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9dd0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  CK );.        as
9de0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9df0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9e00: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9e10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9e20: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9e30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9e40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9e50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
9e60: 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  AL .        );. 
9e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9e80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9e90: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ea0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9eb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9ec0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9ed0: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9ee0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
9ef0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9f00: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9f10: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9f20: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9f30: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
9f40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9f50: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9f60: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9f70: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
9f80: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
9f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9fa0: 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f  Lock>=EXCLUSIVE_
9fb0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9fc0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9fd0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9fe0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9ff0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a000: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a010: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a020: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a030: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a040: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
a050: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a060: 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65  bOrigSize<=pPage
a070: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a090: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a0a0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20  ITER_FINISHED:. 
a0b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a0c0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a0d0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a0e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a0f0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a100: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a110: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a120: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a130: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a140: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a150: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a160: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a170: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a180: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a190: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a1a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a1b0: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a1c0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a1d0: 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a  se PAGER_ERROR:.
a1e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d        /* There m
a1f0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
a200: 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
a210: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
a220: 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20   pager if.      
a230: 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  ** in ERROR stat
a240: 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  e. Otherwise the
a250: 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61   pager should ha
a260: 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70  ve already dropp
a270: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
a280: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a   to OPEN state..
a290: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
a2a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a2b0: 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
a2c0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a2d0: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
a2e0: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
a2f0: 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20  >pPCache)>0 );. 
a300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a310: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
a320: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
a330: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
a340: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a  f SQLITE_DEBUG .
a350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
a360: 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61  ointer to a huma
a370: 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
a380: 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75  g in a static bu
a390: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
a3a0: 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ng the state of 
a3b0: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
a3c0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
a3d0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20  gument. This.** 
a3e0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
a3f0: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65  e used within de
a400: 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61  buggers. For exa
a410: 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65  mple, as an alte
a420: 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70  rnative.** to "p
a430: 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e  rint *pPager" in
a440: 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62   gdb:.**.** (gdb
a450: 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70  ) printf "%s", p
a460: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
a470: 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74  (pPager).*/.stat
a480: 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70  ic char *print_p
a490: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
a4a0: 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *p){.  static c
a4b0: 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a  har zRet[1024];.
a4c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
a4d0: 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a  ntf(1024, zRet,.
a4e0: 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a        "Filename:
a4f0: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
a500: 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20    "State:       
a510: 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c    %s errCode=%d\
a520: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20  n".      "Lock: 
a530: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
a540: 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f       "Locking mo
a550: 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  de:  locking_mod
a560: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a  e=%s\n".      "J
a570: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f  ournal mode:  jo
a580: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22  urnal_mode=%s\n"
a590: 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20  .      "Backing 
a5a0: 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d  store: tempFile=
a5b0: 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a  %d memDb=%d useJ
a5c0: 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20  ournal=%d\n".   
a5d0: 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20     "Journal:    
a5e0: 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c     journalOff=%l
a5f0: 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c  ld journalHdr=%l
a600: 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a  ld\n".      "Siz
a610: 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69  e:          dbsi
a620: 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65  ze=%d dbOrigSize
a630: 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25  =%d dbFileSize=%
a640: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
a650: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
a660: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
a670: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
a680: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
a690: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a6a0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
a6b0: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
a6c0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a6d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
a6e0: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
a6f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
a700: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a710: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a720: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
a730: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
a740: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a750: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
a760: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
a770: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
a780: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a790: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a7a0: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
a7b0: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
a7c0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7d0: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
a7e0: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
a7f0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
a800: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
a810: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
a820: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
a830: 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20      ? "NO_LOCK" 
a840: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
a850: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
a860: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
a870: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a880: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a890: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
a8a0: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
a8b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
a8c0: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
a8d0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a8e0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
a8f0: 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e  CK    ? "UNKNOWN
a900: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
a910: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
a920: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
a930: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
a940: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
a950: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a960: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
a970: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
a980: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
a990: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a9a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
a9b0: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
a9c0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
a9d0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a9e0: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
a9f0: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
aa00: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
aa10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
aa20: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
aa30: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
aa40: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
aa50: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aa60: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
aa70: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
aa80: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
aa90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aaa0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
aab0: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
aac0: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
aad0: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
aae0: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
aaf0: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
ab00: 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  al.      , p->jo
ab10: 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75  urnalOff, p->jou
ab20: 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20  rnalHdr.      , 
ab30: 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20  (int)p->dbSize, 
ab40: 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69  (int)p->dbOrigSi
ab50: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69  ze, (int)p->dbFi
ab60: 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72  leSize.  );..  r
ab70: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
ab80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
ab90: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
aba0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
abb0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
abc0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
abd0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
abe0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
abf0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
ac00: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
ac10: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
ac20: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
ac30: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
ac40: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
ac50: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
ac60: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ac70: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
ac80: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
ac90: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
aca0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
acb0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
acc0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
acd0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
ace0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
acf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ad00: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
ad10: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67  gHdr *pPg){.  Pg
ad20: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
ad30: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
ad40: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
ad50: 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  er;.  int i;.  f
ad60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72  or(i=0; i<pPager
ad70: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b  ->nSavepoint; i+
ad80: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
ad90: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
ada0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
adb0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
adc0: 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d  Orig>=pgno && 0=
add0: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
ade0: 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  st(p->pInSavepoi
adf0: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
ae00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
ae10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ae20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ae30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
ae40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
ae50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
ae60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
ae70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
ae80: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
ae90: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
aea0: 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61  vecTest(pPg->pPa
aeb0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
aec0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a   pPg->pgno);.}..
aed0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
aee0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
aef0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
af00: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
af10: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
af20: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
af30: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
af40: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
af50: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
af60: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
af70: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
af80: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
af90: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
afa0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
afb0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
afd0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
afe0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
aff0: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
b000: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
b010: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
b020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b030: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
b040: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
b050: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
b070: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
b080: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
b090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b0a0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b0b0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
b0c0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
b0d0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
b0e0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
b0f0: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
b100: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
b110: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a  yte((u8*)A,B)...
b120: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b130: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b140: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
b150: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
b160: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
b170: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
b180: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
b190: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b1a0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
b1b0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
b1c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b1d0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b1e0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
b1f0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
b200: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
b210: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
b220: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
b230: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
b240: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
b250: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
b260: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
b270: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b280: 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48  NO_LOCK.** or SH
b290: 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72  ARED_LOCK. Regar
b2a0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
b2b0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c   or not the call
b2c0: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
b2d0: 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74   succeeds, set t
b2e0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
b2f0: 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68  ariable to match
b300: 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29   the (attempted)
b310: 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   new lock..**.**
b320: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
b330: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
b340: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
b350: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
b360: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
b370: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b380: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
b390: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
b3a0: 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f  ine of .** UNKNO
b3b0: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
b3c0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
b3d0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
b3e0: 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  t pagerUnlockDb(
b3f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b400: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
b410: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b420: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
b430: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
b440: 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  de || pPager->eL
b450: 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock==eLock );.  
b460: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e  assert( eLock==N
b470: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  O_LOCK || eLock=
b480: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b490: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21    assert( eLock!
b4a0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65  =NO_LOCK || page
b4b0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
b4c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
b4d0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
b4e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
b4f0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  ager->eLock>=eLo
b500: 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ck );.    rc = s
b510: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
b520: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
b530: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
b540: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
b550: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
b560: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b570: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
b580: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b590: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
b5a0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b5b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b5c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
b5d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b5e0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
b5f0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
b600: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
b610: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
b620: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
b630: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
b640: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
b650: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
b660: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
b670: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
b680: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
b690: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b6a0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b6b0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b6c0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b6d0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
b6e0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
b6f0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
b700: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
b710: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
b720: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
b730: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
b740: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
b750: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b760: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
b770: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
b780: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
b790: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
b7a0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
b7b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b7c0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
b7d0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
b7e0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
b7f0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
b800: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b810: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
b820: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
b830: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
b840: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
b850: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
b860: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
b870: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
b880: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b890: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
b8a0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
b8b0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
b8c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
b8d0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b8e0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b8f0: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
b900: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
b910: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
b920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b930: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b940: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
b950: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
b960: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
b970: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
b980: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
b990: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
b9a0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
b9b0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
b9c0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
b9d0: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
b9e0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
b9f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ba00: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
ba10: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
ba20: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
ba30: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
ba40: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
ba50: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
ba60: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
ba70: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
ba80: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
ba90: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
baa0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
bab0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
bac0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
bad0: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
bae0: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
baf0: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
bb00: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
bb10: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
bb20: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
bb30: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
bb40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
bb50: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
bb60: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
bb70: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
bb80: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
bb90: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
bba0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
bbb0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
bbc0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
bbd0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
bbe0: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
bbf0: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
bc00: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bc10: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
bc20: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
bc30: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
bc40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bc50: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
bc60: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
bc70: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
bc80: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 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 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
bcb0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
bcc0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
bcd0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
bce0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
bcf0: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
bd00: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
bd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
bd40: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
bd50: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
bd60: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
bd70: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
bd80: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
bd90: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
bda0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
bdb0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
bdc0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
bdd0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
bde0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
bdf0: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
be00: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
be10: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
be20: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
be30: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
be40: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
be50: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
be60: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
be70: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
be80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
be90: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
bea0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
beb0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
bec0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
bed0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
bee0: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
bef0: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
bf00: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
bf10: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
bf20: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
bf30: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
bf40: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
bf50: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
bf60: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
bf70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
bf80: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
bf90: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
bfa0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
bfb0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
bfc0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
bfd0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
bfe0: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
bff0: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
c000: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
c010: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c020: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
c030: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
c040: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
c050: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
c060: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
c070: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
c080: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c090: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
c0a0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
c0b0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
c0c0: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
c0d0: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
c0e0: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
c0f0: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
c100: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c110: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
c120: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
c130: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
c140: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
c150: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
c160: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
c170: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
c180: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c190: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
c1a0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
c1b0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
c1c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
c1d0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
c1e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
c1f0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
c200: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
c210: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
c220: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
c230: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
c240: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
c250: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
c260: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
c270: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
c280: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
c290: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
c2a0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
c2b0: 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
c2c0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
c2d0: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
c2e0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
c2f0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
c300: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
c310: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
c320: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
c330: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
c340: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  (X)  0.#define p
c350: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c360: 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45  h(X).#define CHE
c370: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
c380: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
c390: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
c3a0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
c3b0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
c3c0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
c3d0: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
c3e0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66   open..** This f
c3f0: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
c400: 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65   to read a maste
c410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c420: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ame from the .**
c430: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c440: 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73   and, if success
c450: 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69  ful, copies it i
c460: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
c470: 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ied .** by the c
c480: 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65  aller. See comme
c490: 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d  nts above writeM
c4a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
c4b0: 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a  or the format.**
c4c0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
c4d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c4e0: 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65  file name at the
c4f0: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
c500: 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d  l file..**.** zM
c510: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
c520: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
c530: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
c540: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
c550: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
c560: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
c570: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
c580: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
c590: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
c5a0: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
c5b0: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
c5c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
c5d0: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
c5e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
c5f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
c600: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
c610: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
c620: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
c630: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
c640: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
c650: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
c660: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
c670: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
c680: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
c690: 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72  *.** If a master
c6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c6b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74  me is present at
c6c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c6d0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c  journal.** file,
c6e0: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
c6f0: 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
c700: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
c710: 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e   zMaster. A.** n
c720: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
c730: 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  te is appended t
c740: 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c  o the buffer fol
c750: 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65  lowing the maste
c760: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r.** journal fil
c770: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
c780: 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
c790: 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72  d that no master
c7a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c7b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a  me is present .*
c7c0: 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  * zMaster[0] is 
c7d0: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
c7e0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
c7f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
c800: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
c810: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
c820: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
c830: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
c840: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
c850: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
c860: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
c870: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
c880: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
c890: 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73  Master, u32 nMas
c8a0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
c8d0: 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  e */.  u32 len; 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62    /* Length in b
c900: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ytes of master j
c910: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
c920: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
c930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c940: 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74  otal size in byt
c950: 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  es of journal fi
c960: 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33  le pJrnl */.  u3
c970: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
c980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63           /* MJ c
c990: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65  hecksum value re
c9a0: 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ad from journal 
c9b0: 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
c9e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
c9f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
ca00: 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75  ic[8];   /* A bu
ca10: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
ca20: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
ca30: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
ca40: 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c  '\0';..  if( SQL
ca50: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
ca60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ca70: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20  pJrnl, &szJ)).  
ca80: 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c   || szJ<16.   ||
ca90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
caa0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
cab0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
cac0: 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d  )).   || len>=nM
cad0: 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c  aster .   || SQL
cae0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
caf0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
cb00: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29  szJ-12, &cksum))
cb10: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cb20: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
cb30: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
cb40: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a  gic, 8, szJ-8)).
cb50: 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61     || memcmp(aMa
cb60: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
cb70: 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c  ic, 8).   || SQL
cb80: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
cb90: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
cba0: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
cbb0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20   szJ-16-len)).  
cbc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
cbd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
cbe0: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
cbf0: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
cc00: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
cc10: 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  */.  for(u=0; u<
cc20: 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63  len; u++){.    c
cc30: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
cc40: 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  u];.  }.  if( ck
cc50: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
cc60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
cc70: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
cc80: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
cc90: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
cca0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
ccb0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
ccc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
ccd0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
cce0: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
ccf0: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
cd00: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
cd10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
cd20: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
cd30: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
cd40: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
cd50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  e..    */.    le
cd60: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61  n = 0;.  }.  zMa
cd70: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
cd80: 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  ;.   .  return S
cd90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cda0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
cdb0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74  fset of the sect
cdc0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f  or boundary at o
cdd0: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  r immediately .*
cde0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
cdf0: 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d  value in pPager-
ce00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73  >journalOff, ass
ce10: 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a  uming a sector .
ce20: 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65  ** size of pPage
ce30: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79  r->sectorSize by
ce40: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  tes..**.** i.e f
ce50: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
ce60: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20   of 512:.**.**  
ce70: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
ce80: 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  f          Retur
ce90: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d  n value.**   ---
cea0: 2d 2d 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 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20      0.**   512  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30       512.**   10
cf10: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
cf20: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
cf30: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
cf40: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
cf50: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ** .*/.static i6
cf60: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  4 journalHdrOffs
cf70: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
cf80: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
cf90: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
cfa0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cfb0: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
cfc0: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
cfd0: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
cfe0: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
cff0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d000: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
d010: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
d020: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d030: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
d040: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
d050: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
d060: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
d070: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
d080: 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b    return offset;
d090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
d0a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
d0b0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
d0c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d0d0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
d0e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
d0f0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72  o-op if the jour
d100: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  nal file has not
d110: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
d120: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63  .** within the c
d130: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
d140: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65  on (i.e. if Page
d150: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29  r.journalOff==0)
d160: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75  ..**.** If doTru
d170: 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  ncate is non-zer
d180: 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a  o or the Pager.j
d190: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d1a0: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73  variable is.** s
d1b0: 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72  et to 0, then tr
d1c0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
d1d0: 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  al file to zero 
d1e0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
d1f0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72  therwise,.** zer
d200: 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65  o the 28-byte he
d210: 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72  ader at the star
d220: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
d230: 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72   file. In either
d240: 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68   case, .** if th
d250: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
d260: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
d270: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
d280: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
d290: 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74  y .** after writ
d2a0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
d2b0: 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  g it..**.** If P
d2c0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d2d0: 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20  Limit is set to 
d2e0: 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d  a positive, non-
d2f0: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a  zero value, and.
d300: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d310: 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a   truncation or z
d320: 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64  eroing described
d330: 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20   above the size 
d340: 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e  of the .** journ
d350: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
d360: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
d370: 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e  this value, then
d380: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
d390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d3a0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d3b0: 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54  zeLimit bytes. T
d3c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d3d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64  does.** not need
d3e0: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f   to be synced fo
d3f0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d400: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
d410: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
d420: 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f  urs, abandon pro
d430: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d440: 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  rn the IO error 
d450: 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  code..** Otherwi
d460: 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  se, return SQLIT
d470: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
d480: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
d490: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
d4a0: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
d4b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
d4c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_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 2f 2a 20 52 65 74 75 72 6e         /* Return
d4f0: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
d500: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
d510: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
d520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d530: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
d540: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
d550: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
d560: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
d570: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
d580: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
d590: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
d5a0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
d5b0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
d5c0: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
d5d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d5e0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
d5f0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
d600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
d610: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
d620: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
d630: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d640: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
d650: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
d660: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
d670: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
d680: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d690: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
d6a0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
d6b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
d6c0: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
d6d0: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
d6e0: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
d6f0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
d700: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
d710: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
d720: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
d730: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
d740: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
d750: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
d760: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
d770: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
d780: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
d790: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
d7a0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
d7b0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
d7c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
d7d0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
d7e0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
d7f0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
d800: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
d810: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
d820: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
d830: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
d840: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d850: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
d860: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d870: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
d880: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
d890: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d8a0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d8b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
d8c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
d8d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
d8e0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
d8f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d900: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
d910: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
d920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d930: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d940: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
d950: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d960: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
d970: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d980: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
d990: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
d9a0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
d9b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
d9c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
d9d0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
d9e0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
d9f0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
da00: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
da10: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
da20: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
da30: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
da40: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
da50: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
da60: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
da70: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
da80: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
da90: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
daa0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
dab0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
dac0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
dad0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
dae0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
daf0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
db00: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
db10: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
db20: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
db30: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
db40: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
db50: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
db60: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
db70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
db80: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
db90: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
dba0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
dbb0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
dbc0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
dbd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbf0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
dc00: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
dc10: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
dc20: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
dc30: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
dc40: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
dc50: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
dc60: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
dc70: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
dc80: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
dc90: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
dca0: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
dcd0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
dce0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
dcf0: 69 6e 74 20 69 69 3b 20 20 20 20 20 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 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
dd20: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
dd30: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
dd40: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
dd50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
dd60: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
dd70: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
dd80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
dd90: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
dda0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
ddb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ddc0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ddd0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
dde0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
ddf0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
de00: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
de10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
de20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
de30: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
de40: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
de50: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
de60: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
de70: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
de80: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
de90: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
dea0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
deb0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
dec0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
ded0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
dee0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
def0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
df00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
df10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
df20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
df30: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
df40: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
df50: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
df60: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
df70: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
df80: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
df90: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
dfa0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
dfb0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
dfc0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
dfd0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
dfe0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
dff0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
e000: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
e010: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
e020: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
e030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
e040: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
e050: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
e060: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
e070: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
e080: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
e090: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
e0a0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
e0b0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
e0c0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
e0d0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
e0e0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
e0f0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
e100: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
e110: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
e120: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
e130: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
e140: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
e150: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e160: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
e170: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
e180: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
e190: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
e1a0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
e1b0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
e1c0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
e1d0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
e1e0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
e1f0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
e200: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
e210: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
e220: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
e230: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
e240: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
e250: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
e260: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
e270: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
e280: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
e290: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
e2a0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
e2b0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
e2c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
e2d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e2e0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
e2f0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
e300: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
e310: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
e320: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
e330: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e340: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
e350: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
e360: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
e370: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
e380: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
e390: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
e3a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
e3b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
e3c0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
e3d0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e3e0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
e3f0: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
e400: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
e410: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
e420: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
e430: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
e440: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e450: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
e460: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e470: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
e480: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
e490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
e4a0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
e4b0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e4c0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
e4d0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
e4e0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
e4f0: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
e500: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
e510: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
e520: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
e530: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
e540: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e550: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e560: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
e570: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e580: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
e590: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
e5a0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e5b0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e5c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
e5d0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
e5e0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
e5f0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
e600: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
e610: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
e620: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e630: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e640: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
e650: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
e660: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
e670: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
e680: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e690: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
e6a0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
e6b0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
e6c0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
e6d0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
e6e0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
e6f0: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
e700: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
e710: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e720: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
e730: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
e740: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
e750: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
e760: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
e770: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
e780: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
e790: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
e7a0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
e7b0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
e7c0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e7d0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
e7e0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
e7f0: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
e800: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
e810: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
e820: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
e830: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
e840: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
e850: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
e860: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
e870: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
e880: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
e890: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
e8a0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
e8b0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
e8c0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
e8d0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
e8e0: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
e8f0: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
e900: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
e910: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
e920: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
e930: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
e940: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
e950: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
e960: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
e970: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
e980: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
e990: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
e9a0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
e9b0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
e9c0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
e9d0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
e9e0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
e9f0: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
ea00: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
ea10: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
ea20: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
ea30: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
ea40: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ea50: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
ea60: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
ea70: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
ea80: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
ea90: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
eaa0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
eab0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
eac0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
ead0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
eae0: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
eaf0: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
eb00: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
eb10: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
eb20: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
eb30: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
eb40: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
eb50: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
eb60: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
eb70: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
eb80: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
eb90: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
eba0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
ebb0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
ebc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
ebd0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
ebe0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
ebf0: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
ec00: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
ec10: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
ec20: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
ec30: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
ec40: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
ec50: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ec60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
ec70: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
ec80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ec90: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
eca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ecb0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
ecc0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
ecd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ece0: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
ecf0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
ed00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
ed10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
ed20: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
ed30: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
ed40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ed50: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
ed60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
ed70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
ed80: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
ed90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
eda0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
edb0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
edc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
edd0: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
ede0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
edf0: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
ee00: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
ee10: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
ee20: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
ee30: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
ee40: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
ee50: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
ee60: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
ee70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
ee80: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
ee90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
eea0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
eeb0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
eec0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
eed0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
eee0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
eef0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
ef00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
ef10: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
ef20: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
ef30: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
ef40: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
ef50: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
ef60: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
ef70: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
ef80: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
ef90: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
efa0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
efb0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
efc0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
efd0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
efe0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
eff0: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
f000: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
f010: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
f020: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
f030: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
f040: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f050: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
f060: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f070: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
f080: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
f090: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
f0a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
f0b0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
f0c0: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
f0d0: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
f0e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f0f0: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
f100: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
f110: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
f120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f130: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f140: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
f150: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
f160: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
f170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f180: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
f190: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
f1a0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
f1b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
f1e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
f1f0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
f200: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
f210: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
f220: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
f230: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
f240: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f250: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
f260: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
f270: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
f280: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
f290: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
f2a0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f2b0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
f2c0: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
f2d0: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
f2e0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
f2f0: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
f300: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f310: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
f320: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
f330: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
f340: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
f350: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
f360: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
f370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f380: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
f390: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
f3a0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
f3b0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
f3c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
f3d0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
f3e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f3f0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
f400: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
f410: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
f420: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
f430: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
f440: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f450: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
f460: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
f470: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
f480: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
f490: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
f4a0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
f4b0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
f4c0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
f4d0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
f4e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
f4f0: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
f500: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
f510: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
f520: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
f530: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
f540: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
f550: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
f560: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f570: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
f580: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f590: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f5a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
f5b0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
f5c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f5d0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
f5e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f5f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
f600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
f610: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
f620: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
f630: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f640: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
f650: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
f660: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
f670: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
f680: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
f690: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
f6a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
f6b0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f6c0: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
f6d0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
f6e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
f6f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f700: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f710: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
f720: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f730: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f740: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f750: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
f760: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f770: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f780: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f790: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f7a0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
f7b0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
f7c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
f7d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
f7e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
f7f0: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
f800: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f810: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
f820: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
f830: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
f840: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
f850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
f860: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
f870: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f880: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
f890: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
f8a0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
f8b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f8c0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
f8d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f8e0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f8f0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f900: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
f910: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
f920: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
f930: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
f940: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
f950: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
f960: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
f970: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f980: 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
f990: 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
f9a0: 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
f9b0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
f9c0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
f9d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
f9e0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
f9f0: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
fa00: 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
fa10: 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
fa20: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
fa30: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
fa40: 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
fa50: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fa60: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
fa70: 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
fa80: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
fa90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
faa0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
fab0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fac0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fad0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
fae0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
faf0: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
fb00: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
fb10: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
fb20: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
fb30: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
fb40: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fb50: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
fb60: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
fb70: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
fb80: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
fb90: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
fba0: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
fbb0: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
fbc0: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
fbd0: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
fbe0: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
fbf0: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
fc00: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
fc10: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
fc20: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
fc30: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
fc40: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
fc50: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
fc60: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
fc70: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
fc80: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
fc90: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
fca0: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
fcb0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
fcc0: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
fcd0: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
fce0: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
fcf0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
fd00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fd10: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
fd20: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
fd30: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
fd40: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
fd50: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
fd60: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
fd70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
fd80: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
fd90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fda0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
fdb0: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
fdc0: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
fdd0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
fde0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
fdf0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
fe00: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
fe10: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
fe20: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
fe30: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
fe40: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
fe50: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
fe60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
fe70: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
fe80: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
fe90: 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
fea0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
feb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fec0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
fed0: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
fee0: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
fef0: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
ff00: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
ff10: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
ff20: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
ff30: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
ff40: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
ff50: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
ff60: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
ff70: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
ff80: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
ff90: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
ffa0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
ffb0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
ffc0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
ffd0: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
ffe0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
fff0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10000 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10010 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10020 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
10030 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
10040 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
10050 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
10060 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10070 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
10080 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
10090 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
100a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
100b0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
100c0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
100d0 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
100e0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
100f0 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10100 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10110 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10120 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
10130 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
10140 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
10150 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
10160 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
10170 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
10180 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
10190 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
101a0 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
101b0 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
101c0 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
101d0 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
101e0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
101f0 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10200 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10210 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10220 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
10230 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
10240 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
10250 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
10260 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
10270 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
10280 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
10290 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
102a0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
102b0 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
102c0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
102d0 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
102e0 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
102f0 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10300 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10310 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10320 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
10330 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
10340 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
10350 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
10360 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
10370 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
10380 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
10390 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
103a0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
103b0 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
103c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
103d0 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
103e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
103f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10400 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10410 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10440 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
10450 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
10460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
10470 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
10480 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
10490 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
104b0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
104c0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
104d0 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
104e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
104f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10500 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
10510 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
10520 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
10550 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
10560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10570 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
10580 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
10590 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
105a0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
105b0 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
105c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
105d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
105e0 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
105f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10600 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10610 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
10620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10630 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10640 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10650 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
10660 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
10670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10680 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10690 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
106a0 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
106b0 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
106c0 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
106d0 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
106e0 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
106f0 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
10700 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
10710 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
10720 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
10730 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
10740 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
10750 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
10760 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
10770 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
10780 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
10790 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
107a0 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
107b0 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
107c0 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
107d0 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
107e0 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
107f0 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
10800 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10810 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
10820 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10830 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
10840 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
10850 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
10860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10870 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
10880 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10890 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
108a0 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
108b0 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
108c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
108d0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
108e0 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
108f0 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
10900 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
10910 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10920 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
10930 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
10940 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
10950 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
10960 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
10970 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
10980 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
10990 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
109a0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
109b0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
109c0 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
109d0 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
109e0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
109f0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a00 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a10 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
10a20 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
10a30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10a40 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10a50 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
10a60 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
10a70 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
10a80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10a90 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10aa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
10ab0 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
10ac0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
10ad0 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
10ae0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
10af0 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
10b00 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
10b10 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
10b20 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10b30 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10b40 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
10b50 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
10b60 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
10b70 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
10b80 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
10b90 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
10ba0 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
10bb0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
10bc0 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
10bd0 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
10be0 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
10bf0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
10c00 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
10c10 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10c20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
10c30 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
10c40 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
10c50 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
10c60 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
10c70 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
10c80 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
10c90 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
10ca0 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
10cb0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
10cc0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10cd0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
10ce0 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
10cf0 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
10d00 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
10d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10d20 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
10d30 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
10d40 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
10d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10d60 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
10d70 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
10d80 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
10d90 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
10da0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
10db0 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
10dc0 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
10dd0 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
10de0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
10df0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
10e00 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
10e10 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
10e20 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
10e30 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
10e60 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
10e70 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
10e80 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
10e90 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
10ea0 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
10eb0 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
10ec0 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
10ed0 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
10ee0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
10ef0 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
10f00 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
10f10 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
10f20 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
10f30 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
10f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
10f50 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
10f60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
10f70 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
10f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
10f90 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
10fa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10fb0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
10fc0 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
10fd0 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
10fe0 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
10ff0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
11000 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11010 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11020 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11030 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11040 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11050 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
11060 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
11070 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
11080 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11090 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
110a0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
110b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
110c0 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
110d0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
110e0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
110f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11100 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11110 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11120 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11130 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11140 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11150 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11160 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11180 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11190 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
111a0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
111b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
111c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
111d0 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
111e0 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
111f0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
11200 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11210 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
11220 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11230 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11240 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
11250 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
11260 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
11270 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11280 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
11290 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
112a0 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
112b0 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
112c0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
112d0 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
112e0 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
112f0 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
11300 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11310 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
11320 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
11330 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
11340 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
11350 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
11360 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
11370 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
11380 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
113b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
113c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
113d0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
113e0 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
113f0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11400 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11410 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
11420 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
11430 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
11440 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
11450 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
11460 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
11470 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
11480 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
11490 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
114a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
114b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
114c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
114d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
114e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
114f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11500 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11510 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
11520 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11530 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
11540 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
11550 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
11560 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
11570 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
11580 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
11590 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
115a0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
115b0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
115c0 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
115d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
115e0 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
115f0 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
11600 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
11610 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
11620 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
11630 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
11640 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11650 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
11660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
11670 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
11680 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
11690 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
116a0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
116b0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
116c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
116d0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
116e0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
116f0 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
11700 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
11710 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
11720 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
11730 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
11740 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
11750 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
11760 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
11770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
11780 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
11790 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
117a0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
117b0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
117c0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
117d0 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
117e0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
117f0 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
11800 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
11810 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
11820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11830 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
11840 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
11850 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11860 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
11870 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
11880 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11890 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
118a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
118b0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
118c0 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
118d0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
118e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
118f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
11900 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
11910 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11920 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
11930 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
11940 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
11950 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
11960 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
11970 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
11980 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
11990 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
119a0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
119b0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
119c0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
119d0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
119e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11a10 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
11a20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
11a30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
11a40 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
11a50 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
11a60 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11a70 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
11a80 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
11a90 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11aa0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
11ab0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
11ac0 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
11ad0 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
11ae0 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
11af0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11b00 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
11b10 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
11b20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
11b30 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
11b40 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
11b50 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
11b60 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
11b70 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
11b80 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11b90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11ba0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
11bb0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11bc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
11bd0 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
11be0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11bf0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11c00 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
11c10 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11c20 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11c30 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
11c40 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11c50 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11c60 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
11c70 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
11c80 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11c90 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
11ca0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
11cb0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
11cc0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
11cd0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
11ce0 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
11cf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
11d00 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
11d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11d20 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
11d30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11d40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11d50 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11d60 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
11d70 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
11d80 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
11d90 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
11da0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
11db0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
11dc0 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
11dd0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
11de0 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
11df0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
11e00 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
11e10 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
11e20 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
11e30 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
11e40 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
11e50 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
11e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11e70 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
11e80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11e90 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
11ea0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
11eb0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
11ec0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
11ed0 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
11ee0 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
11ef0 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
11f00 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
11f10 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
11f20 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
11f30 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
11f40 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
11f50 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
11f60 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
11f70 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
11f80 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
11f90 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
11fa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
11fb0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
11fc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
11fd0 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
11fe0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
11ff0 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12000 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12010 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12020 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12030 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12040 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12050 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12060 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12070 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12080 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12090 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
120a0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
120b0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
120c0 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
120d0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
120e0 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
120f0 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12100 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12110 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12120 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12130 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12140 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12150 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
12160 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12170 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12180 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12190 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
121a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
121b0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
121c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
121d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
121e0 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
121f0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
12200 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12210 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
12220 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
12230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
12240 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12250 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45   whenever an IOE
12260 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  RR or FULL error
12270 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a   that requires.*
12280 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  * the pager to t
12290 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74  ransition into t
122a0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d  he ERROR state m
122b0 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64  ay ahve occurred
122c0 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  ..** The first a
122d0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
122e0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
122f0 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
12300 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20   second .** the 
12310 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
12320 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
12330 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
12340 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a  unction. The .**
12350 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
12360 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
12370 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12380 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12390 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
123a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
123b0 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c   is SQLITE_FULL,
123c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
123d0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49   one of the.** I
123e0 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20  OERR sub-codes, 
123f0 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
12400 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12410 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12420 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ode.** is stored
12430 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64   in Pager.errCod
12440 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  e. While the pag
12450 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68  er remains in th
12460 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a  e ERROR state,.*
12470 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20  * all major API 
12480 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67  calls on the Pag
12490 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
124a0 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72  ely return Pager
124b0 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  .errCode..**.** 
124c0 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  The ERROR state 
124d0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
124e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
124f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
12500 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
12510 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
12520 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
12530 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
12540 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
12550 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12560 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
12570 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
12580 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
12590 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
125a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
125b0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
125c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
125d0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
125e0 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
125f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12610 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
12620 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
12630 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
12640 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
12650 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12660 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
12670 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
12680 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
12690 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
126a0 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
126b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
126c0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
126d0 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
126e0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
126f0 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
12700 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
12710 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
12720 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
12730 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
12740 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
12750 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
12760 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12770 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
12780 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12790 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
127a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
127b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
127c0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
127d0 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
127e0 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
127f0 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
12800 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
12810 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
12820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
12830 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
12840 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
12850 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
12860 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
12870 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
12880 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
12890 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
128a0 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
128b0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
128c0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
128d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
128e0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
128f0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
12900 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
12910 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
12920 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
12930 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
12940 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
12950 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
12960 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
12970 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
12980 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
12990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
129a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
129b0 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
129c0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
129d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
129e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
129f0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
12a00 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
12a10 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
12a20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
12a30 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
12a40 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
12a50 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
12a60 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
12a70 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
12a80 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
12a90 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
12aa0 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
12ab0 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
12ac0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
12ad0 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
12ae0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
12af0 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
12b00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12b10 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12b20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12b30 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
12b40 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
12b50 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
12b60 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
12b70 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12b80 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12b90 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
12ba0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
12bb0 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
12bc0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
12bd0 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
12be0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
12bf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
12c00 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
12c10 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
12c20 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
12c30 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
12c40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
12c50 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12c60 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
12c70 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
12c80 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
12c90 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
12ca0 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
12cb0 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
12cc0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
12cd0 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
12ce0 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
12cf0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
12d00 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
12d10 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
12d20 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
12d30 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
12d40 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12d50 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
12d60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12d70 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
12d80 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
12d90 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
12da0 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
12db0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12dc0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12dd0 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
12de0 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
12df0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
12e00 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
12e10 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
12e20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
12e30 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
12e40 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
12e50 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
12e60 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
12e70 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
12e80 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
12e90 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
12ea0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
12eb0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
12ec0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12ed0 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
12ee0 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
12ef0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
12f00 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
12f10 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
12f20 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
12f30 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
12f40 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
12f50 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
12f60 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
12f70 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
12f80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
12f90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12fa0 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
12fb0 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
12fc0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
12fd0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
12fe0 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
12ff0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
13000 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
13010 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13020 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
13030 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
13040 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
13050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13060 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
13070 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
13080 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
13090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
130a0 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
130b0 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
130c0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
130d0 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
130e0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
130f0 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
13100 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
13110 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
13120 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
13130 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
13140 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
13150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
13160 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
13170 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
13180 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
13190 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
131a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
131b0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
131c0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
131d0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
131e0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
131f0 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13200 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13210 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13220 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13230 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13240 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13250 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
13260 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
13270 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
13280 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
13290 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
132a0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
132b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
132c0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
132d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
132e0 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
132f0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13300 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13310 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13320 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13330 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13340 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13350 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13360 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13370 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
13380 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
13390 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
133a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
133b0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
133c0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
133d0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
133e0 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
133f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13400 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13410 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13420 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13430 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13440 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13450 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13460 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13470 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
13480 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
13490 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
134a0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
134b0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
134c0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
134d0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
134e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
134f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13500 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13520 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13530 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13540 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13550 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13560 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13570 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13590 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
135a0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
135b0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
135c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
135d0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
135e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
135f0 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13600 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13620 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13630 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13640 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13650 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13660 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13670 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13680 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
136a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
136b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
136c0 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
136d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
136e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
136f0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13700 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13710 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13720 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13730 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13740 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13760 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13770 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13780 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13790 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
137a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
137b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
137d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
137e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
137f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13800 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
13810 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13820 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
13830 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
13840 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13850 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
13860 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
13870 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
13880 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
13890 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
138a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
138b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
138c0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
138d0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
138e0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
138f0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
13900 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
13910 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
13920 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
13930 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
13940 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
13950 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
13960 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
13970 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
13980 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
13990 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
139a0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
139b0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
139c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
139d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
139e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
139f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13a00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
13a10 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
13a20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13a30 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13a40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13a50 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
13a60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13a70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13a80 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
13a90 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13aa0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13ab0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
13ac0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
13ad0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
13ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
13af0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
13b00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
13b10 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
13b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
13b30 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
13b40 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50  PAGES.  sqlite3P
13b50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
13b60 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
13b70 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
13b80 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50  ehash);.  if( pP
13b90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
13ba0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
13bb0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
13bc0 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
13bd0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61     PgHdr *p = pa
13be0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
13bf0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
13c00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
13c10 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
13c20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
13c30 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ef(p);.    }.  }
13c40 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
13c50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
13c60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
13c70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
13c80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
13c90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
13ca0 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
13cb0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
13cc0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73  r->pPCache);.  s
13cd0 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
13ce0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
13cf0 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
13d00 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61  Size);..  if( pa
13d10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13d20 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
13d30 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
13d40 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
13d50 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
13d60 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
13d70 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
13d80 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
13d90 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
13da0 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
13db0 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
13dc0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
13dd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
13de0 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
13df0 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
13e00 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
13e10 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
13e20 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
13e30 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
13e40 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
13e50 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
13e60 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70   (!pagerUseWal(p
13e70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65  Pager) || sqlite
13e80 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
13e90 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
13ea0 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32  0)).  ){.    rc2
13eb0 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
13ec0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
13ed0 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
13ee0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
13ef0 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ne = 0;.  }.  pP
13f00 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
13f10 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70  AGER_READER;.  p
13f20 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
13f30 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
13f40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
13f50 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
13f60 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
13f70 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
13f80 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
13f90 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
13fa0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13fb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
13fc0 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
13fd0 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
13fe0 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  OR state, do not
13ff0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
14000 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
14010 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
14020 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14030 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
14040 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14050 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
14060 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
14070 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
14080 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
14090 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20  e file and move 
140a0 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
140b0 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66  o OPEN state. If
140c0 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20   this .** means 
140d0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
140e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
140f0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
14100 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a  tem, the next .*
14110 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * connection to 
14120 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
14130 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
14140 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
14150 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69  this one) .** wi
14160 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ll roll it back.
14170 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14180 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
14190 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
141a0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74  ERROR state, but
141b0 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
141c0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
141d0 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
141e0 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
141f0 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
14200 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
14210 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
14220 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
14230 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
14240 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
14250 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
14260 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
14270 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
14280 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
14290 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
142a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
142b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
142c0 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
142d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
142e0 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
142f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
14300 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
14310 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
14320 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
14330 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
14340 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ED ){.      sqli
14350 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14360 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
14370 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
14380 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14390 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
143a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
143b0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
143c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
143d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
143e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
143f0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
14400 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  ;.      pager_en
14410 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
14420 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
14430 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
14440 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
14450 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
14460 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
14470 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
14480 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
14490 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
144a0 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
144b0 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
144c0 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
144d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
144e0 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
144f0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
14500 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
14510 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
14520 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
14530 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
14540 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
14550 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
14560 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
14570 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
14580 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
14590 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
145a0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
145b0 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
145c0 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
145d0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
145e0 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
145f0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
14600 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
14610 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14620 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
14630 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
14640 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
14650 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
14660 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
14670 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
14680 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
14690 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
146a0 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
146b0 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
146c0 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
146d0 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
146e0 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
146f0 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
14700 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
14710 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
14720 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
14730 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
14740 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
14750 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
14760 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
14770 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
14780 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
14790 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
147a0 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
147b0 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
147c0 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
147d0 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
147e0 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
147f0 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
14800 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
14810 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
14820 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
14830 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
14840 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
14850 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
14860 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
14870 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
14880 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
14890 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
148a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
148b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
148c0 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
148d0 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
148e0 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
148f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
14900 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
14910 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
14920 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
14930 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
14940 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
14950 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
14960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
14970 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
14980 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
14990 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
149a0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
149b0 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
149c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
149d0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
149e0 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
149f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
14a20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
14a30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
14a40 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
14a50 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
14a60 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
14a70 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
14a80 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
14a90 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
14aa0 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
14ab0 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
14ac0 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
14ad0 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
14ae0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
14af0 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
14b00 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
14b10 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
14b20 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
14b30 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
14b40 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
14b50 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
14b60 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
14b70 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
14b80 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
14b90 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
14ba0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
14bb0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
14bc0 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
14bd0 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
14be0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
14bf0 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
14c00 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
14c10 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
14c20 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
14c30 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
14c40 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
14c50 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
14c60 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
14c70 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
14c80 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
14c90 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
14ca0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
14cc0 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
14cd0 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
14ce0 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
14cf0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
14d00 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
14d10 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
14d20 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
14d30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
14d40 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
14d50 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
14d60 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
14d70 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
14d80 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
14d90 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
14da0 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
14db0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
14dc0 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
14dd0 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
14de0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
14df0 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
14e00 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
14e10 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
14e20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14e30 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
14e40 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
14e50 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14e60 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
14e70 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
14e80 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
14e90 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
14ea0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
14eb0 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
14ec0 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
14ed0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
14ee0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
14ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
14f00 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
14f10 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
14f20 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14f30 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
14f40 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
14f50 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
14f60 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
14f70 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
14f80 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
14f90 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
14fa0 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
14fb0 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
14fc0 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
14fd0 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
14fe0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
14ff0 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
15000 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
15010 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
15020 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
15030 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
15040 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
15050 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
15060 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
15070 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
15080 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
15090 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
150a0 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
150b0 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
150c0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
150d0 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
150e0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
150f0 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
15100 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
15110 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
15120 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
15130 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
15140 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
15150 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
15160 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
15170 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
15180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15190 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
151a0 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
151b0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
151c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
151d0 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
151e0 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
151f0 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
15200 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
15210 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
15220 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
15230 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
15240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15250 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
15260 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
15270 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
15280 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
15290 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
152a0 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
152b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
152c0 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
152f0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15300 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
15310 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
15340 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
15350 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
15360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15370 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15380 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
15390 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
153a0 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
153d0 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
153e0 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
153f0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
15400 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
15410 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
15420 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
15430 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
15440 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15450 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
15460 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
15470 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
15480 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
15490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
154a0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
154b0 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
154c0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
154d0 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
154e0 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
154f0 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
15500 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
15510 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
15520 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
15530 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
15540 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
15550 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
15560 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
15570 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
15580 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
15590 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
155a0 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
155b0 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
155c0 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
155d0 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
155e0 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
155f0 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
15600 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
15610 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
15620 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
15630 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
15640 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
15650 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
15660 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
15670 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
15680 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
15690 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
156a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
156b0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
156c0 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
156d0 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
156e0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
156f0 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
15700 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
15710 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
15720 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
15730 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
15740 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
15750 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
15760 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
15770 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
15780 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
15790 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
157a0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
157b0 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
157c0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
157d0 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
157e0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
157f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15800 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
15810 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15820 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
15830 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
15840 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
15850 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
15860 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
15870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15880 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
15890 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
158a0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
158b0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
158c0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
158d0 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
158e0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
158f0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
15900 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
15910 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
15920 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
15930 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
15940 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
15950 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
15960 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
15970 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
15980 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
15990 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
159a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
159b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
159c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
159d0 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
159e0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
159f0 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
15a00 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
15a10 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15a20 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
15a30 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
15a40 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
15a50 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
15a60 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
15a70 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
15a80 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
15a90 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
15aa0 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
15ab0 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
15ac0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
15ad0 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
15ae0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
15af0 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
15b00 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
15b10 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
15b20 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
15b30 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
15b40 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
15b50 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
15b60 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
15b70 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
15b80 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
15b90 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
15ba0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
15bb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
15bc0 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
15bd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15be0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
15bf0 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
15c00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
15c10 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
15c20 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
15c30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15c40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
15c50 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
15c60 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
15c70 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
15c80 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
15c90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
15ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
15cb0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
15cc0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
15cd0 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
15ce0 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
15cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
15d00 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
15d10 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
15d20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15d30 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f  n played by befo
15d40 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  re during the cu
15d50 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  rrent.  ** rollb
15d60 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20  ack, then don't 
15d70 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69  bother to play i
15d80 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20  t back again..  
15d90 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  */.  if( pDone &
15da0 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
15db0 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
15dc0 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
15dd0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
15de0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  rc;.  }..  /* Wh
15df0 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
15e00 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20  page 1, restore 
15e10 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74  the nReserve set
15e20 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ting.  */.  if( 
15e30 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65  pgno==1 && pPage
15e40 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75  r->nReserve!=((u
15e50 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b  8*)aData)[20] ){
15e60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
15e70 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44  serve = ((u8*)aD
15e80 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61  ata)[20];.    pa
15e90 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
15ea0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
15eb0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
15ec0 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
15ed0 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
15ee0 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
15ef0 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
15f00 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
15f10 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
15f20 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
15f30 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
15f40 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
15f50 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
15f60 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
15f70 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
15f80 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
15f90 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
15fa0 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
15fb0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
15fc0 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
15fd0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
15fe0 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
15ff0 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
16000 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
16010 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
16020 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
16030 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
16040 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
16050 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
16060 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
16070 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
16080 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
16090 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
160a0 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
160b0 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
160c0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
160d0 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
160e0 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
160f0 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
16100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
16110 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57   WRITER_DBMOD, W
16120 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f  RITER_FINISHED o
16130 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
16140 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
16150 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68  .  ** pager cach
16160 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61  e if it exists a
16170 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
16180 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
16190 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20  en marked .  ** 
161a0 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65  not dirty. Since
161b0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e   this code is on
161c0 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50  ly executed in P
161d0 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
161e0 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a  for.  ** a hot-j
161f0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
16200 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
16210 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
16220 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20  cache is empty. 
16230 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72   ** if the pager
16240 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74   is in OPEN stat
16250 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  e..  **.  ** Tic
16260 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
16270 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
16280 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
16290 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
162a0 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
162b0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
162c0 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
162d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
162e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
162f0 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
16300 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
16310 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
16320 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
16330 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
16340 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
16350 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
16360 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
16370 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
16380 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
16390 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
163a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
163b0 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
163c0 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
163d0 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
163e0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
163f0 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
16400 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
16410 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
16420 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
16430 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
16440 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
16450 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
16460 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
16470 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
16480 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
16490 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
164a0 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
164b0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
164c0 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
164d0 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
164e0 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
164f0 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
16500 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
16510 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
16520 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
16530 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
16540 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
16550 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
16560 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
16570 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
16580 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
16590 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
165a0 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
165b0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
165c0 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
165d0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
165e0 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
165f0 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
16600 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
16610 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
16620 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
16630 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
16640 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
16650 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
16660 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
16670 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
16680 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
16690 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
166a0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
166b0 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
166c0 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
166d0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
166e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
166f0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
16700 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
16710 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
16720 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
16730 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
16740 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
16750 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
16760 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
16770 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  Pg==0 );.  PAGER
16780 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
16790 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
167a0 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
167b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
167c0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
167d0 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
167e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
167f0 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
16800 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
16810 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
16820 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
16830 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
16840 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
16850 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
16860 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
16870 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
16880 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
16890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
168a0 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
168b0 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
168c0 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
168d0 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
168e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
168f0 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  fd).   && (pPage
16900 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
16910 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
16920 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
16930 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20  =PAGER_OPEN).   
16940 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
16950 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
16960 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
16970 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
16980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
16990 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
169a0 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
169b0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
169c0 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
169d0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
169e0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
169f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
16a00 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
16a10 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
16a20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
16a30 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
16a40 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
16a50 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
16a60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
16a70 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
16a80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16a90 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
16aa0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
16ab0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
16ac0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
16ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
16ae0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
16af0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
16b00 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
16b10 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
16b20 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
16b30 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
16b40 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
16b50 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16b60 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
16b70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
16b80 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
16b90 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
16ba0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
16bb0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
16bc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
16bd0 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
16be0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
16bf0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
16c00 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
16c10 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
16c20 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
16c30 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
16c40 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
16c50 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
16c60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
16c70 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
16c80 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
16c90 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
16ca0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
16cb0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
16cc0 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
16cd0 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
16ce0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
16cf0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
16d00 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
16d10 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
16d20 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
16d30 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
16d40 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
16d50 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
16d60 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
16d70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
16d80 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
16d90 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
16da0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
16db0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16dc0 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
16dd0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
16de0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
16df0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
16e00 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
16e10 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
16e20 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
16e30 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
16e40 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
16e50 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
16e60 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
16e70 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
16e80 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
16e90 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
16ea0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
16eb0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
16ec0 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
16ed0 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
16ee0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
16ef0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
16f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16f10 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
16f20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
16f30 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
16f40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16f50 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
16f60 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
16f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16f80 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
16f90 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
16fa0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
16fb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16fc0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16fd0 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
16fe0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
16ff0 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
17000 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
17010 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
17020 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
17030 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17040 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17050 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
17060 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
17070 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
17080 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
17090 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
170a0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
170b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
170c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
170d0 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
170e0 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
170f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
17100 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
17110 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
17120 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
17130 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
17140 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
17150 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
17160 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
17170 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
17180 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
17190 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
171a0 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
171b0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
171c0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
171d0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
171e0 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
171f0 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
17200 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
17210 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17220 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
17230 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
17240 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
17250 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
17260 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
17270 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17280 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
17290 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
172a0 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
172b0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
172c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
172d0 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
172e0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
172f0 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
17300 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
17310 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
17320 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
17330 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
17340 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
17350 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
17360 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
17370 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
17380 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
17390 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
173a0 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
173b0 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
173c0 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
173d0 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
173e0 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
173f0 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
17400 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
17410 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17420 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
17430 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
17440 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
17450 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
17460 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
17470 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
17480 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
17490 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
174a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
174b0 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
174c0 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
174d0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
174e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
174f0 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
17500 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
17510 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
17520 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17530 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
17540 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
17550 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
17560 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
17570 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
17580 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
17590 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
175a0 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
175b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
175c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
175d0 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
175e0 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
175f0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
17600 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
17610 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
17620 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
17630 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
17640 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
17650 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
17660 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
17670 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
17680 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
17690 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
176a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
176b0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
176c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
176d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
176e0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
176f0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
17700 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
17710 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
17720 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
17730 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
17740 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
17750 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
17760 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
17770 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
17780 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
17790 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
177a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
177b0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
177c0 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
177d0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
177e0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
177f0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
17800 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
17810 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
17820 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
17830 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
17840 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17850 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
17860 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
17870 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
17880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17890 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
178a0 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
178b0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
178c0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
178d0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
178e0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
178f0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
17900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
17910 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
17920 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
17930 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
17940 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
17950 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
17960 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17970 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
17980 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
17990 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
179a0 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
179b0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
179c0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
179d0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
179e0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
179f0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
17a00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
17a10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17a20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
17a30 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
17a40 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
17a50 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
17a60 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
17a70 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
17a80 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
17a90 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
17aa0 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
17ab0 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
17ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17ad0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
17ae0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
17af0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
17b00 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
17b10 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
17b20 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
17b30 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
17b40 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
17b50 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
17b60 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
17b70 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
17b80 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
17b90 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
17ba0 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
17bb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17bc0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
17bd0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
17be0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
17bf0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
17c00 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
17c10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
17c20 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
17c30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
17c40 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
17c50 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
17c60 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
17c70 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
17c80 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
17c90 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
17ca0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
17cb0 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
17cc0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
17cd0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
17ce0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
17cf0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
17d00 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
17d10 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
17d20 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
17d30 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
17d40 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
17d50 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
17d60 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
17d70 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
17d80 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
17d90 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
17da0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
17db0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
17dc0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
17dd0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
17de0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
17df0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
17e00 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
17e10 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
17e20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
17e30 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
17e40 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
17e50 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
17e60 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
17e70 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
17e80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
17e90 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
17ea0 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
17eb0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
17ec0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
17ed0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
17ee0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
17ef0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
17f00 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
17f10 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
17f20 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
17f30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17f40 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
17f50 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
17f60 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
17f70 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
17f80 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
17f90 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
17fa0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
17fb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
17fc0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
17fd0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
17fe0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
17ff0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18000 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18010 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18020 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18030 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18040 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18050 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18060 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18070 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18080 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
180a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
180b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
180c0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
180d0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
180e0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
180f0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18100 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18110 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18120 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18130 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18140 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18150 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18160 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18170 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18180 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18190 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
181a0 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
181b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
181c0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
181d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
181e0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
181f0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18200 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18210 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18220 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18230 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18240 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18250 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18260 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18270 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18280 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18290 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
182a0 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
182b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
182c0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
182d0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
182e0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
182f0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
18300 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
18310 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
18320 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
18330 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
18340 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
18350 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
18360 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
18370 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
18380 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18390 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
183a0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
183b0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
183c0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
183d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
183e0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
183f0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23 69   int flags = .#i
18400 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18410 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
18420 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76        (pPager->v
18430 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
18440 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49  PEN_FILEPROTECTI
18450 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66  ON_MASK)|.#endif
18460 0a 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f  .      (SQLITE_O
18470 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
18480 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
18490 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
184a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
184b0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
184c0 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
184d0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
184e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
184f0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18500 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
18510 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
18520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
18530 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
18540 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
18550 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
18560 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
18570 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
18580 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
18590 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
185a0 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
185b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
185c0 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
185d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
185e0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
185f0 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
18600 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
18610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
18620 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
18630 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
18640 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18650 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18660 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
18670 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
18680 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
18690 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
186a0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
186b0 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
186c0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
186d0 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
186e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
186f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18700 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
18710 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18720 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
18730 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
18740 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
18750 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
18760 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
18770 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
18780 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
18790 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
187a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
187b0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
187c0 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
187d0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
187e0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
187f0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
18800 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
18810 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
18820 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
18830 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
18840 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
18850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18860 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
18870 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
18880 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
18890 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
188a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
188b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
188c0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
188d0 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
188e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
188f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
18900 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
18910 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18920 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
18930 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
18940 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
18950 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
18960 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
18970 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
18980 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
18990 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
189a0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
189b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
189c0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
189d0 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  = .#if SQLITE_EN
189e0 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
189f0 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 28 70 50  TION.        (pP
18a00 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
18a10 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
18a20 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c  ROTECTION_MASK)|
18a30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
18a40 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
18a50 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
18a60 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
18a70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18a80 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
18a90 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
18aa0 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
18ab0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18ac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18ad0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18ae0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
18af0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
18b00 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
18b10 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
18b20 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
18b30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
18b40 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
18b50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18b60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18b70 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18b80 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
18b90 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
18ba0 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
18bb0 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
18bc0 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
18bd0 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
18be0 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
18bf0 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
18c00 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
18c10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
18c20 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  /.        goto d
18c30 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18c40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18c50 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c  zJournal += (sql
18c60 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f  ite3Strlen30(zJo
18c70 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20  urnal)+1);.  }. 
18c80 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
18c90 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63  e(pMaster);.  rc
18ca0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
18cb0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
18cc0 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
18cd0 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
18ce0 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
18cf0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73  nal);.  if( pMas
18d00 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
18d10 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
18d20 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
18d30 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c  !isOpen(pJournal
18d40 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
18d50 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
18d60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18d70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
18d80 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
18d90 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61   to change the a
18da0 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
18db0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
18dc0 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
18dd0 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c  system. This onl
18de0 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
18df0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
18e00 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72  saction,.** or r
18e10 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
18e20 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75  ansaction (inclu
18e30 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63  ding rolling bac
18e40 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  k a hot-journal)
18e50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
18e60 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
18e70 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
18e80 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  r the pager is n
18e90 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  ot in either.** 
18ea0 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74  DBMOD or OPEN st
18eb0 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
18ec0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
18ed0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69  therwise, the si
18ee0 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  ze .** of the fi
18ef0 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  le is changed to
18f00 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
18f10 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
18f20 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a  Size bytes). .**
18f30 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
18f40 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
18f50 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
18f60 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
18f70 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
18f80 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
18f90 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
18fa0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
18fb0 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
18fc0 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
18fd0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
18fe0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
18ff0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
19000 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
19010 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
19020 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
19030 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
19040 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
19050 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
19060 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
19070 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
19080 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
19090 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
190a0 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
190b0 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
190c0 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
190d0 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
190e0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
190f0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
19100 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
19110 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
19120 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
19130 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
19140 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
19150 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
19160 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
19170 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19180 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
19190 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
191a0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
191b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
191c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
191d0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
191e0 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
191f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
19200 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
19210 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28    .  if( isOpen(
19220 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20  pPager->fd) .   
19230 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
19240 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
19250 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
19260 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
19270 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20  OPEN) .  ){.    
19280 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
19290 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e   newSize;.    in
192a0 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65  t szPage = pPage
192b0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
192c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
192d0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
192e0 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a  E_LOCK );.    /*
192f0 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
19300 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
19310 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
19320 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
19330 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
19340 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
19350 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
19360 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69  Size = szPage*(i
19370 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
19380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19390 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d  && currentSize!=
193a0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
193b0 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65   if( currentSize
193c0 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  >newSize ){.    
193d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
193e0 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
193f0 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b  r->fd, newSize);
19400 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19410 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70        char *pTmp
19420 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
19430 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65  pace;.        me
19440 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a  mset(pTmp, 0, sz
19450 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Page);.        t
19460 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
19470 65 2d 73 7a 50 61 67 65 29 20 3c 20 20 63 75 72  e-szPage) <  cur
19480 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
19490 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
194a0 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d  ewSize-szPage) =
194b0 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b  = currentSize );
194c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
194d0 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
194e0 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69  ge) >  currentSi
194f0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ze );.        rc
19500 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
19510 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54  e(pPager->fd, pT
19520 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53  mp, szPage, newS
19530 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20  ize-szPage);.   
19540 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
19550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19560 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19570 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
19580 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
19590 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
195a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
195b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
195c0 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
195d0 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  e variable for t
195e0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65  he given.** page
195f0 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76  r based on the v
19600 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
19610 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
19620 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
19630 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
19640 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72  file. The sector
19650 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73   size will be us
19660 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64  ed used .** to d
19670 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
19680 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20  e and alignment 
19690 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
196a0 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72  r and .** master
196b0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
196c0 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64  s within created
196d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
196e0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
196f0 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66  ary files the ef
19700 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
19710 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31  ize is always 51
19720 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  2 bytes..**.** O
19730 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f  therwise, for no
19740 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n-temporary file
19750 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  s, the effective
19760 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a   sector size is.
19770 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  ** the value ret
19780 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
19790 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f  ctorSize() metho
197a0 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  d rounded up to 
197b0 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  32 if.** it is l
197c0 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20  ess than 32, or 
197d0 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
197e0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
197f0 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
19800 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
19810 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61  TOR_SIZE..*/.sta
19820 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
19830 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
19840 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
19850 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
19860 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
19870 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
19880 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
19890 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  ile ){.    /* Se
198a0 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
198b0 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
198c0 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
198d0 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
198e0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
198f0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
19900 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
19910 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
19920 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
19930 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20  ill segfault..  
19940 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
19950 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
19960 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
19970 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
19980 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
19990 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29  >sectorSize<32 )
199a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
199b0 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
199c0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
199d0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58  ->sectorSize>MAX
199e0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
199f0 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
19a00 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
19a10 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
19a20 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58  sectorSize = MAX
19a30 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
19a40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
19a50 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
19a60 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
19a70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19a80 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
19a90 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
19aa0 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
19ab0 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
19ac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
19ad0 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
19ae0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
19af0 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
19b00 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
19b10 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
19b20 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
19b30 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
19b40 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
19b50 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19b60 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
19b70 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
19b80 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
19b90 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
19ba0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
19bb0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
19bc0 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
19bd0 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
19be0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
19bf0 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
19c00 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
19c10 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
19c20 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
19c30 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
19c40 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
19c50 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
19c60 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
19c70 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19c80 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
19c90 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
19ca0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
19cb0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
19cc0 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
19cd0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
19ce0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
19cf0 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
19d00 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
19d10 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
19d20 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
19d30 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
19d40 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
19d50 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
19d60 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
19d70 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
19d80 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
19d90 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
19da0 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
19db0 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
19dc0 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
19dd0 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
19de0 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
19df0 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
19e00 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
19e10 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
19e20 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
19e30 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
19e40 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
19e50 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
19e60 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
19e70 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
19e80 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
19e90 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
19ea0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
19eb0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
19ec0 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
19ed0 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
19ee0 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
19ef0 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
19f00 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
19f10 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
19f20 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
19f30 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
19f40 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
19f50 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
19f60 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
19f70 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
19f80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
19f90 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
19fa0 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
19fb0 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
19fc0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
19fd0 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
19fe0 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
19ff0 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1a000 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a010 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1a020 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1a030 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1a040 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1a050 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1a060 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1a070 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1a080 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1a090 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1a0a0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1a0b0 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1a0c0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1a0d0 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1a0e0 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1a0f0 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1a100 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1a110 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1a120 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1a130 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1a140 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1a150 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1a160 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1a170 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1a180 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1a190 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1a1a0 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1a1b0 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1a1c0 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1a1d0 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1a1e0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1a1f0 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1a200 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1a210 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1a220 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1a230 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1a240 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1a250 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1a260 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1a270 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1a280 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1a290 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1a2a0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1a2b0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1a2c0 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1a2d0 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1a2e0 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1a2f0 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1a300 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1a310 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1a320 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1a330 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1a340 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1a350 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1a360 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1a370 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1a380 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1a390 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1a3a0 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1a3b0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1a3c0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1a3d0 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1a3e0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1a3f0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1a400 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1a410 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1a420 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1a430 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1a440 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1a450 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1a460 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1a470 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1a480 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1a490 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1a4a0 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1a4b0 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1a4c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1a4d0 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1a4e0 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1a4f0 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1a500 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1a510 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1a520 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1a530 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1a540 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1a550 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1a560 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1a570 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1a580 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1a590 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1a5a0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1a5b0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1a5c0 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1a5d0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1a5e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1a5f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1a600 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1a610 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1a620 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a630 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1a640 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1a650 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1a660 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1a670 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1a680 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1a690 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1a6a0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1a6b0 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1a6c0 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1a6d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a6e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1a6f0 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1a700 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1a710 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1a720 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1a730 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1a740 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1a750 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1a760 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1a770 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a780 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1a790 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1a7a0 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1a7b0 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1a7c0 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1a7d0 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a  ge rollback */..
1a7e0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1a7f0 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
1a800 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
1a810 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
1a820 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
1a830 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
1a840 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
1a850 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1a860 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
1a870 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1a880 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
1a890 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a8a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1a8b0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1a8c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
1a8d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a8e0 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
1a8f0 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
1a900 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
1a910 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1a920 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
1a930 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
1a940 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1a950 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
1a960 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
1a970 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
1a980 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
1a990 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
1a9a0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
1a9b0 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
1a9c0 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
1a9d0 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
1a9e0 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
1a9f0 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
1aa00 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
1aa10 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
1aa20 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
1aa30 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
1aa40 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
1aa50 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
1aa60 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1aa70 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
1aa80 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
1aa90 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
1aaa0 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
1aab0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
1aac0 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
1aad0 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
1aae0 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
1aaf0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1ab00 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
1ab10 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1ab20 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1ab30 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1ab40 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1ab50 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
1ab60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ab70 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
1ab80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ab90 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
1aba0 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
1abb0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
1abc0 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
1abd0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1abe0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
1abf0 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
1ac00 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1ac10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1ac20 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
1ac30 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
1ac40 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
1ac50 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
1ac60 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
1ac70 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
1ac80 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
1ac90 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
1aca0 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
1acb0 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
1acc0 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
1acd0 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
1ace0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
1acf0 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
1ad00 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
1ad10 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1ad20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
1ad30 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
1ad40 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
1ad50 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1ad60 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
1ad70 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
1ad80 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
1ad90 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
1ada0 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20  ocess must have 
1adb0 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
1adc0 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
1add0 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
1ade0 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
1adf0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1ae00 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
1ae10 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
1ae20 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
1ae30 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
1ae40 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
1ae50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
1ae60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1ae70 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1ae80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ae90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1aea0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1aeb0 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
1aec0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1aed0 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1aee0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
1aef0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
1af00 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
1af10 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
1af20 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
1af30 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
1af40 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
1af50 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
1af60 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
1af70 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1af80 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
1af90 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
1afa0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1afb0 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
1afc0 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
1afd0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1afe0 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
1aff0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1b000 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1b010 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1b020 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1b030 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1b040 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
1b050 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
1b060 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1b070 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1b080 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
1b090 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
1b0a0 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
1b0b0 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
1b0c0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
1b0d0 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
1b0e0 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
1b0f0 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
1b100 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
1b110 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
1b120 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
1b130 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1b140 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
1b150 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
1b160 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
1b170 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
1b180 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1b190 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
1b1a0 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
1b1b0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1b1c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b1d0 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
1b1e0 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
1b1f0 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
1b200 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
1b210 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
1b220 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
1b230 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
1b240 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b250 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
1b260 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1b270 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
1b280 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
1b290 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
1b2a0 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
1b2b0 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
1b2c0 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
1b2d0 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
1b2e0 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
1b2f0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
1b300 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1b310 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
1b320 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
1b330 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
1b340 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
1b350 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1b360 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1b370 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
1b380 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
1b390 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
1b3a0 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
1b3b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1b3c0 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
1b3d0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b3e0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
1b3f0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1b400 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
1b410 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
1b420 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1b430 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
1b440 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
1b450 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b460 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b470 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1b480 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
1b490 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1b4a0 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
1b4b0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1b4c0 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
1b4d0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
1b4e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b4f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b500 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1b510 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
1b520 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
1b530 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
1b540 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
1b550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b560 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1b570 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1b580 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1b590 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
1b5a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1b5b0 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
1b5c0 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
1b5d0 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
1b5e0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
1b5f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1b600 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
1b610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1b620 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
1b630 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
1b640 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
1b650 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
1b660 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1b670 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
1b680 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
1b690 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1b6a0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1b6b0 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65  ge(pPager,&pPage
1b6c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
1b6d0 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,0);.      if( 
1b6e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b6f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1b700 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1b710 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1b720 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1b730 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b740 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1b750 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b760 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1b770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1b780 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1b790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1b7a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1b7b0 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1b7c0 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1b7d0 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1b7e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1b7f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1b800 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1b810 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1b820 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1b830 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1b840 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1b850 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1b860 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1b870 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1b880 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1b890 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1b8a0 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1b8b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1b8c0 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1b8d0 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1b8e0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1b8f0 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1b900 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b910 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1b920 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1b930 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1b940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1b950 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1b960 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1b970 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1b980 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1b990 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1b9a0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1b9b0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1b9c0 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1b9d0 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1b9e0 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1b9f0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1ba00 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1ba10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1ba20 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1ba30 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1ba40 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1ba50 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1ba60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ba70 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1ba80 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1ba90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1baa0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1bab0 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1bac0 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1bad0 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
1bae0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
1baf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1bb00 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
1bb10 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
1bb20 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
1bb30 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1bb40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
1bb50 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
1bb60 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1bb70 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
1bb80 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
1bb90 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
1bba0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
1bbb0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1bbc0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
1bbd0 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  dified..  */.  a
1bbe0 73 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65  ssert(.    pPage
1bbf0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d  r->fd->pMethods=
1bc00 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65  =0 ||.    sqlite
1bc10 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
1bc20 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
1bc30 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1bc40 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f  GED,0)>=SQLITE_O
1bc50 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  K.  );..  /* If 
1bc60 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
1bc70 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
1bc80 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
1bc90 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
1bca0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
1bcb0 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
1bcc0 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
1bcd0 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
1bce0 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
1bcf0 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
1bd00 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
1bd10 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
1bd20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
1bd30 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
1bd40 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
1bd50 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
1bd60 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
1bd70 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
1bd80 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
1bd90 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
1bda0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
1bdb0 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
1bdc0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
1bdd0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1bde0 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
1bdf0 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
1be00 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
1be10 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
1be20 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
1be30 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
1be40 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1be50 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
1be60 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
1be70 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
1be80 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
1be90 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
1bea0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1beb0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1bec0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
1bed0 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
1bee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bef0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1bf00 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1bf10 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1bf20 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1bf30 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1bf40 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1bf50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
1bf60 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1bf70 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1bf80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bf90 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  OK.   && (pPager
1bfa0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1bfb0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1bfc0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1bfd0 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b  PAGER_OPEN).  ){
1bfe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1bff0 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1c000 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
1c010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c020 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1c030 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1c040 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
1c050 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73  !='\0');.    tes
1c060 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1c070 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1c080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c090 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
1c0a0 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
1c0b0 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
1c0c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
1c0d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1c0e0 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
1c0f0 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
1c100 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1c110 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
1c120 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
1c130 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
1c140 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
1c150 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1c160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1c170 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1c180 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1c190 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1c1a0 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1c1b0 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1c1c0 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1c1d0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1c1e0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1c1f0 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1c200 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1c210 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1c220 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1c230 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1c240 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1c250 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1c260 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1c270 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1c280 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1c290 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1c2a0 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1c2b0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
1c2c0 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
1c2d0 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
1c2e0 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
1c2f0 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1c300 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1c310 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
1c320 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1c330 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
1c340 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
1c350 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
1c360 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1c370 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
1c380 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
1c390 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c3a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
1c3b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1c3c0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1c3d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1c3e0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
1c3f0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1c400 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1c410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1c420 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
1c430 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1c440 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c450 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
1c460 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
1c470 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
1c480 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
1c490 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
1c4a0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1c4b0 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
1c4c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c4e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1c4f0 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20  t isInWal = 0;  
1c500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c510 75 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e  ue if page is in
1c520 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69   log file */.  i
1c530 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1c540 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1c550 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1c560 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1c570 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1c580 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1c590 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1c5a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1c5b0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1c5c0 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f    if( NEVER(!isO
1c5d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29  pen(pPager->fd))
1c5e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c5f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1c600 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
1c610 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
1c620 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c630 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c640 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
1c650 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1c660 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
1c670 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  Try to pull the 
1c680 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72  page from the wr
1c690 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a  ite-ahead log. *
1c6a0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1c6b0 65 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72  e3WalRead(pPager
1c6c0 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
1c6d0 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50  sInWal, pgsz, pP
1c6e0 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20  g->pData);.  }. 
1c6f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c700 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29  OK && !isInWal )
1c710 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1c720 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1c730 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1c740 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1c750 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1c760 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1c770 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1c780 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1c790 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c7a0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c7b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c7c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1c7d0 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1c7e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1c7f0 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1c800 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1c810 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1c820 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1c830 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1c840 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1c850 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1c860 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1c870 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1c880 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1c890 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1c8a0 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1c8b0 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1c8c0 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1c8d0 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1c8e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1c8f0 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1c900 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1c910 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1c920 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1c930 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1c940 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1c950 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1c960 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1c970 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1c980 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1c990 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1c9a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1c9b0 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1c9c0 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1c9d0 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1c9e0 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1c9f0 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1ca00 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1ca10 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1ca20 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1ca30 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1ca40 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75  hite noising equ
1ca50 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f  aling 16 bytes o
1ca60 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68  f 0xff is vanish
1ca70 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20  ingly small so. 
1ca80 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c       ** we shoul
1ca90 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20  d still be ok.. 
1caa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65       */.      me
1cab0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46  mset(pPager->dbF
1cac0 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73  ileVers, 0xff, s
1cad0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1cae0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1caf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
1cb00 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28  *dbFileVers = &(
1cb10 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
1cb20 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  [24];.      memc
1cb30 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1cb40 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
1cb50 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
1cb60 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1cb70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44  .    }.  }.  COD
1cb80 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC1(pPager, pPg-
1cb90 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c  >pData, pgno, 3,
1cba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1cbb0 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e  EM);..  PAGER_IN
1cbc0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1cbd0 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
1cbe0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1cbf0 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
1cc00 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
1cc10 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1cc20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54  pgno));.  PAGERT
1cc30 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
1cc40 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1cc50 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1cc60 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1cc70 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
1cc80 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1cc90 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1cca0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  ;.}../*.** Updat
1ccb0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
1ccc0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1ccd0 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20  r at offsets 24 
1cce0 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65  and 92 in.** the
1ccf0 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
1cd00 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  sqlite version n
1cd10 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20  umber at offset 
1cd20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  96..**.** This i
1cd30 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  s an uncondition
1cd40 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20  al update.  See 
1cd50 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69  also the pager_i
1cd60 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1cd70 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  r().** routine w
1cd80 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65  hich only update
1cd90 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
1cda0 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61  nter if the upda
1cdb0 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a  te is actually.*
1cdc0 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74  * needed, as det
1cdd0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70  ermined by the p
1cde0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1cdf0 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72  ntDone state var
1ce00 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1ce10 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74   void pager_writ
1ce20 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1ce30 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75  PgHdr *pPg){.  u
1ce40 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1ce50 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  r;..  /* Increme
1ce60 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
1ce70 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
1ce80 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
1ce90 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65   24. */.  change
1cea0 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
1ceb0 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
1cec0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46  pPg->pPager->dbF
1ced0 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75  ileVers)+1;.  pu
1cee0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1cef0 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  pPg->pData)+24, 
1cf00 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1cf10 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72  ..  /* Also stor
1cf20 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  e the SQLite ver
1cf30 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62  sion number in b
1cf40 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20  ytes 96..99 and 
1cf50 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32  in.  ** bytes 92
1cf60 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63  ..95 store the c
1cf70 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f  hange counter fo
1cf80 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73  r which the vers
1cf90 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ion number.  ** 
1cfa0 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70  is valid. */.  p
1cfb0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1cfc0 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c  )pPg->pData)+92,
1cfd0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1cfe0 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1cff0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1d000 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52  )+96, SQLITE_VER
1d010 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a  SION_NUMBER);.}.
1d020 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d030 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
1d040 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d050 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72  invoked once for
1d060 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20   each page that 
1d070 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1d080 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
1d090 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77  o the log file w
1d0a0 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61  hen a WAL transa
1d0b0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1d0c0 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74  back..** Paramet
1d0d0 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61  er iPg is the pa
1d0e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69  ge number of sai
1d0f0 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78  d page. The pCtx
1d100 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73   argument .** is
1d110 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e   actually a poin
1d120 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
1d130 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
1d140 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73  * If page iPg is
1d150 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
1d160 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e  cache, and has n
1d170 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
1d180 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20  ferences,.** it 
1d190 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74  is discarded. Ot
1d1a0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
1d1b0 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  e are one or mor
1d1c0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a  e outstanding.**
1d1d0 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65   references, the
1d1e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1d1f0 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74   reloaded from t
1d200 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
1d210 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74  the.** attempt t
1d220 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74  o reload content
1d230 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1d240 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61  se is required a
1d250 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65  nd fails, .** re
1d260 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1d270 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
1d280 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
1d290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1d2a0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1d2b0 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e  (void *pCtx, Pgn
1d2c0 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63  o iPg){.  int rc
1d2d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d2e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1d2f0 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20  (Pager *)pCtx;. 
1d300 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1d310 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
1d320 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
1d330 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67   iPg);.  if( pPg
1d340 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1d350 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
1d360 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b  count(pPg)==1 ){
1d370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
1d380 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
1d390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d3a0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1d3b0 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
1d3c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d3d0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1d3e0 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1d3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d400 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d410 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1d420 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1d430 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1d440 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1d450 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1d460 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1d470 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1d480 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1d490 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1d4a0 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1d4b0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1d4c0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1d4d0 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1d4e0 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1d4f0 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1d500 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1d510 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1d520 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1d530 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1d540 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1d550 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1d560 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1d570 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1d580 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1d590 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1d5a0 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1d5b0 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1d5c0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1d5d0 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1d5e0 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1d5f0 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1d600 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1d610 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1d620 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1d630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1d640 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1d650 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1d660 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1d670 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1d680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d690 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1d6a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1d6b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1d6e0 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1d6f0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1d700 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1d710 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1d720 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1d730 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1d740 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1d750 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1d760 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1d770 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1d780 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1d790 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1d7a0 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1d7b0 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1d7c0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1d7d0 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1d7e0 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1d7f0 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1d800 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1d810 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1d820 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1d830 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1d840 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1d850 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1d860 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1d870 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d880 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1d890 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1d8a0 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1d8b0 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1d8c0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1d8d0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1d8e0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1d8f0 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1d900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d910 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1d920 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1d930 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1d940 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1d950 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1d960 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1d970 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1d980 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1d990 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1d9a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1d9b0 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1d9c0 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1d9d0 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1d9e0 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1d9f0 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1da00 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1da10 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1da20 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1da30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1da40 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1da50 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1da60 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1da70 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1da80 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1da90 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1daa0 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1dab0 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1dac0 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1dad0 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1dae0 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1daf0 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1db00 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1db10 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1db20 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1db30 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1db40 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1db50 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1db60 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1db70 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1db80 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1db90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1dba0 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1dbb0 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1dbc0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1dbd0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1dbe0 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1dbf0 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1dc00 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20  int isCommit,   
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1dc30 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  is a commit */. 
1dc40 20 69 6e 74 20 73 79 6e 63 46 6c 61 67 73 20 20   int syncFlags  
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
1dc70 73 20 74 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f  s to OsSync() (o
1dc80 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  r 0) */.){.  int
1dc90 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dcb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 23  Return code */.#
1dcc0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1dcd0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1dce0 6e 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b  ned(SQLITE_CHECK
1dcf0 5f 50 41 47 45 53 29 0a 20 20 50 67 48 64 72 20  _PAGES).  PgHdr 
1dd00 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1dd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1dd20 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61   looping over pa
1dd30 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ges */.#endif.. 
1dd40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1dd50 3e 70 57 61 6c 20 29 3b 0a 23 69 66 64 65 66 20  >pWal );.#ifdef 
1dd60 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1dd70 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1dd80 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69  e page list is i
1dd90 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
1dda0 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69  r */.  for(p=pLi
1ddb0 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72  st; p && p->pDir
1ddc0 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  ty; p=p->pDirty)
1ddd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1dde0 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74  >pgno < p->pDirt
1ddf0 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23  y->pgno );.  }.#
1de00 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 43  endif..  if( isC
1de10 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1de20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1de30 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1de40 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1de50 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1de60 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1de70 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1de80 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1de90 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1dea0 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1deb0 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1dec0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1ded0 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1dee0 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1def0 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1df00 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1df10 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1df20 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  p;.    PgHdr **p
1df30 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
1df40 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1df50 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 3b 20   (*ppNext = p); 
1df60 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1df70 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1df80 3d 6e 54 72 75 6e 63 61 74 65 20 29 20 70 70 4e  =nTruncate ) ppN
1df90 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79  ext = &p->pDirty
1dfa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1dfb0 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d  rt( pList );.  }
1dfc0 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70  ..  if( pList->p
1dfd0 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
1dfe0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1dff0 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20  er(pList);.  rc 
1e000 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  = sqlite3WalFram
1e010 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  es(pPager->pWal,
1e020 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
1e030 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c  pageSize, pList,
1e040 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f   nTruncate, isCo
1e050 6d 6d 69 74 2c 20 73 79 6e 63 46 6c 61 67 73 0a  mmit, syncFlags.
1e060 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
1e070 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1e080 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
1e090 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
1e0a0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1e0b0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1e0c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
1e0d0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
1e0e0 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e  >pBackup, p->pgn
1e0f0 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74  o, (u8 *)p->pDat
1e100 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  a);.    }.  }..#
1e110 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1e120 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74  CK_PAGES.  pList
1e130 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1e140 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1e150 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f  ->pPCache);.  fo
1e160 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1e170 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e180 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
1e190 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  sh(p);.  }.#endi
1e1a0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
1e1b0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1e1c0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1e1d0 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a  n on the WAL..**
1e1e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e1f0 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c   used to be call
1e200 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61  ed "pagerOpenSna
1e210 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65  pshot()" because
1e220 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a   it essentially.
1e230 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73  ** makes a snaps
1e240 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  hot of the datab
1e250 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65  ase at the curre
1e260 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65  nt point in time
1e270 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a   and preserves.*
1e280 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20  * that snapshot 
1e290 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72  for use by the r
1e2a0 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f  eader in spite o
1e2b0 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63  f concurrently c
1e2c0 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68  hanges by.** oth
1e2d0 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68  er writers or ch
1e2e0 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  eckpointers..*/.
1e2f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e300 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1e310 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
1e320 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e340 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1e350 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   code */.  int c
1e360 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20  hanged = 0;     
1e370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e380 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74  ue if cache must
1e390 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20   be reset */..  
1e3a0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
1e3b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
1e3c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e3d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1e3e0 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
1e3f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
1e400 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  DER );..  /* sql
1e410 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1e420 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
1e430 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
1e440 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
1e450 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1e460 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
1e470 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
1e480 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
1e490 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
1e4a0 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
1e4b0 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
1e4c0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
1e4d0 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
1e4e0 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
1e4f0 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
1e500 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1e510 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1e520 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
1e530 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
1e540 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1e550 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1e560 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
1e570 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e580 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20   || changed ){. 
1e590 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1e5a0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
1e5b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1e5c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
1e5d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1e5e0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1e5f0 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
1e600 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74   PAGER_OPEN.** t
1e610 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
1e620 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  tate to determin
1e630 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1e640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1e650 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73  ** in pages (ass
1e660 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73  uming the page s
1e670 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ize currently st
1e680 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61  ored in Pager.pa
1e690 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  geSize)..**.** I
1e6a0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1e6b0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1e6c0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1e6d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1e6e0 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65  abase.** in page
1e6f0 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  s is stored in *
1e700 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73  pnPage. Otherwis
1e710 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
1e720 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c   (perhaps.** SQL
1e730 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
1e740 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1e750 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
1e760 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a   unmodified..*/.
1e770 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e780 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1e790 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70  *pPager, Pgno *p
1e7a0 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1e7b0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1e7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1e7d0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
1e7e0 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
1e7f0 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20  * Query the WAL 
1e800 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  sub-system for t
1e810 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1e820 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28  . The WalDbsize(
1e830 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ).  ** function 
1e840 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  returns zero if 
1e850 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f  the WAL is not o
1e860 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e  pen (i.e. Pager.
1e870 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  pWal==0), or.  *
1e880 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
1e890 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76  e size is not av
1e8a0 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74  ailable. The dat
1e8b0 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1e8c0 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  t.  ** available
1e8d0 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1e8e0 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20  b-system if the 
1e8f0 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74  log file is empt
1e900 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  y or.  ** contai
1e910 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d  ns no valid comm
1e920 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
1e930 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ns..  */.  asser
1e940 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1e950 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
1e960 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e970 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
1e980 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
1e990 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20  >noReadlock );. 
1e9a0 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
1e9b0 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72  WalDbsize(pPager
1e9c0 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49  ->pWal);..  /* I
1e9d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1e9e0 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69  ize was not avai
1e9f0 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57  lable from the W
1ea00 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20  AL sub-system,. 
1ea10 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74   ** determine it
1ea20 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
1ea30 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1ea40 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
1ea50 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
1ea60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1ea70 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
1ea80 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1ea90 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a   page-size,.  **
1eaa0 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74   round down to t
1eab0 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e  he nearest page.
1eac0 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
1ead0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a  e larger than 0.
1eae0 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
1eaf0 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
1eb00 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c   to contain at l
1eb10 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20  east one page.. 
1eb20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d   */.  if( nPage=
1eb30 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20  =0 ){.    i64 n 
1eb40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1eb50 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1eb60 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79  of db file in by
1eb70 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  tes */.    asser
1eb80 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1eb90 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1eba0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1ebb0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1ebc0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
1ebd0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1ebe0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1ebf0 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20  er->fd, &n);.   
1ec00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ec10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ec20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1ec30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61   }.    }.    nPa
1ec40 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20  ge = (Pgno)(n / 
1ec50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ec60 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  );.    if( nPage
1ec70 3d 3d 30 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20  ==0 && n>0 ){.  
1ec80 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1ec90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1eca0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
1ecb0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1ecc0 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
1ecd0 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
1ece0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1ecf0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1ed00 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1ed10 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1ed20 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1ed30 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1ed40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1ed50 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1ed60 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1ed70 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1ed80 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
1ed90 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1eda0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1edb0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
1edc0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1edd0 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
1ede0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
1edf0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1ee00 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
1ee10 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
1ee20 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
1ee30 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1ee40 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
1ee50 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
1ee60 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
1ee70 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
1ee80 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
1ee90 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
1eea0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
1eeb0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1eec0 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
1eed0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1eee0 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
1eef0 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
1ef00 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1ef10 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
1ef20 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
1ef30 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
1ef40 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1ef50 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
1ef60 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
1ef70 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
1ef80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1ef90 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
1efa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
1efb0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1efc0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1efd0 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
1efe0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1eff0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1f000 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
1f010 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
1f020 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1f030 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
1f040 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
1f050 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
1f060 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
1f070 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
1f080 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
1f090 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
1f0a0 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
1f0b0 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
1f0c0 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
1f0d0 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
1f0e0 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
1f0f0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
1f100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f110 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
1f120 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
1f130 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1f140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1f150 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f160 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1f170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f180 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1f190 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  D_LOCK || pPager
1f1a0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a  ->noReadlock );.
1f1b0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1f1c0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
1f1d0 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1f0 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
1f200 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
1f210 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1f220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f230 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
1f240 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1f250 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
1f260 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
1f270 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
1f280 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f290 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1f2a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f2b0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1f2c0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1f2d0 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
1f2e0 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a       isWal = 0;.
1f2f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1f310 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
1f320 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
1f330 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
1f340 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1f350 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20  S, &isWal.      
1f360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f380 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
1f390 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l ){.        tes
1f3a0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
1f3b0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
1f3c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
1f3d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
1f3e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1f3f0 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
1f400 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1f410 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f420 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
1f430 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
1f440 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f450 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
1f460 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1f470 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
1f480 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f490 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1f4a0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1f4b0 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
1f4c0 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
1f4d0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
1f4e0 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
1f4f0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
1f500 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1f510 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
1f520 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
1f530 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
1f540 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
1f550 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
1f560 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
1f570 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1f580 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
1f590 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
1f5a0 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
1f5b0 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
1f5c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1f5d0 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
1f5e0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
1f5f0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
1f600 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
1f610 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
1f620 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
1f630 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
1f640 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
1f650 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
1f660 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
1f670 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
1f680 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
1f690 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
1f6a0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
1f6b0 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
1f6c0 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
1f6d0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
1f6e0 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
1f6f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1f700 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
1f710 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
1f720 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1f730 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
1f740 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
1f750 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1f760 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
1f770 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1f780 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
1f790 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
1f7a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1f7b0 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
1f7c0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
1f7d0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
1f7e0 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
1f7f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1f800 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
1f810 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
1f820 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
1f830 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
1f840 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
1f850 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
1f860 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
1f870 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
1f880 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1f890 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
1f8a0 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
1f8b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
1f8c0 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
1f8d0 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
1f8e0 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
1f8f0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
1f900 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
1f910 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
1f920 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
1f930 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
1f940 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
1f950 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
1f960 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
1f970 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
1f980 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
1f990 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
1f9a0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1f9b0 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
1f9c0 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
1f9d0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
1f9e0 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
1f9f0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1fa00 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
1fa10 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
1fa20 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1fa30 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
1fa40 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
1fa50 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1fa60 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
1fa70 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
1fa80 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
1fa90 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
1faa0 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
1fab0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
1fac0 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
1fad0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1fae0 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
1faf0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
1fb00 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
1fb10 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
1fb20 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
1fb30 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
1fb40 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
1fb50 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
1fb60 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
1fb70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fb80 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
1fb90 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
1fba0 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
1fbb0 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
1fbc0 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fbe0 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
1fbf0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1fc00 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
1fc10 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
1fc20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
1fc30 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
1fc40 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
1fc50 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
1fc60 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1fc70 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1fc80 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
1fc90 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1fca0 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
1fcb0 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
1fcc0 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
1fcd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fce0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1fcf0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
1fd00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1fd10 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1fd20 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
1fd30 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
1fd40 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
1fd50 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
1fd60 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
1fd70 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
1fd80 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
1fd90 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1fda0 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
1fdb0 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
1fdc0 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
1fdd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fde0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1fdf0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1fe00 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
1fe10 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
1fe20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
1fe30 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
1fe40 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
1fe50 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
1fe60 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1fe70 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
1fe80 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
1fe90 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
1fea0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
1feb0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1fec0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1fed0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
1fee0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
1fef0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1ff00 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1ff10 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1ff20 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
1ff30 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
1ff40 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
1ff50 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
1ff60 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
1ff70 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
1ff80 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
1ff90 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
1ffa0 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
1ffb0 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
1ffc0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1ffd0 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
1ffe0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
1fff0 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
20000 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
20010 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
20020 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
20030 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
20040 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
20050 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
20060 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
20070 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
20080 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
20090 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
200a0 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
200b0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
200c0 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
200d0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
200e0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
200f0 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
20100 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
20110 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
20120 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
20130 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
20140 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
20150 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
20160 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
20170 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
20180 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
20190 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
201a0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
201b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
201c0 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
201d0 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
201e0 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
201f0 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
20200 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
20210 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
20220 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
20230 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
20240 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
20250 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
20260 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
20270 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20280 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
20290 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
202a0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
202b0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
202c0 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
202d0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
202e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
202f0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
20300 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
20310 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
20320 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
20330 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20340 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
20350 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
20360 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
20370 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
20380 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
20390 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
203a0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
203b0 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
203c0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
203d0 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
203e0 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
203f0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
20400 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
20410 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
20420 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
20430 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
20440 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
20450 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
20460 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
20470 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
20480 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
20490 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
204a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
204b0 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
204c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
204d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
204e0 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
204f0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
20500 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
20510 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
20520 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
20530 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
20540 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
20550 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
20560 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20570 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
20580 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
20590 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
205a0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
205b0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
205c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
205d0 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
205e0 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
205f0 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
20600 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
20610 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
20620 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
20630 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
20640 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
20650 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
20660 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
20670 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20680 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
20690 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
206a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
206b0 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
206c0 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
206d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
206e0 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
206f0 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
20700 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
20710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20720 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
20730 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20740 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
20750 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20760 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20770 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
20780 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
20790 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
207a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
207b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
207c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
207d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
207e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
207f0 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
20800 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
20810 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
20820 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
20830 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
20840 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
20850 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
20860 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20870 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
20880 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
20890 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
208a0 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
208b0 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
208c0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
208d0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
208e0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
208f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
20900 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
20910 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76  64 offset = pSav
20920 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
20930 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
20940 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
20950 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20960 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
20970 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
20980 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
20990 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
209a0 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
209b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
209c0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
209d0 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
209e0 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
209f0 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
20a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
20a10 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67  fset==ii*(4+pPag
20a20 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
20a30 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
20a40 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
20a50 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
20a60 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
20a70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
20a80 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20a90 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
20aa0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
20ab0 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
20ac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20ad0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
20ae0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
20af0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20b00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
20b10 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
20b20 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
20b30 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
20b40 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
20b50 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
20b60 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
20b70 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
20b80 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
20b90 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
20ba0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
20bb0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
20bc0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
20bd0 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
20be0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
20bf0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
20c00 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
20c10 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
20c20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
20c30 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
20c40 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
20c50 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
20c60 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
20c70 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
20c80 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
20c90 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
20ca0 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
20cb0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
20cc0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
20cd0 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
20ce0 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
20cf0 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
20d00 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
20d10 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
20d20 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
20d30 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
20d40 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
20d50 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
20d60 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
20d70 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
20d80 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
20d90 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
20da0 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
20db0 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
20dc0 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
20de0 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
20df0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
20e00 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
20e10 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
20e20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
20e30 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
20e40 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
20e50 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
20e60 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
20e70 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
20e80 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
20e90 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
20ea0 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
20eb0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
20ec0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
20ee0 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
20ef0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
20f00 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
20f10 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
20f20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
20f30 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
20f40 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
20f50 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
20f60 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
20f70 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
20f80 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
20f90 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
20fa0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
20fb0 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
20fc0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
20fd0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
20ff0 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
21000 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
21010 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
21020 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
21030 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
21040 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
21050 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
21060 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
21070 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
21080 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d   for a rollback-
21090 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46  journal mode.  F
210a0 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46  or WAL mode, OFF
210b0 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f   continues.** to
210c0 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79   mean that no sy
210d0 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20  ncs ever occur. 
210e0 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68   NORMAL means th
210f0 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79  at the WAL is sy
21100 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  nced.** prior to
21110 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68   the start of ch
21120 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61  eckpoint and tha
21130 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
21140 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  ile is synced.**
21150 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
21160 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  on of the checkp
21170 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69  oint if the enti
21180 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  re content of th
21190 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69  e WAL.** was wri
211a0 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
211b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  he database.  Bu
211c0 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74  t no sync operat
211d0 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a  ions occur for.*
211e0 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f  * an ordinary co
211f0 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d  mmit in NORMAL m
21200 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46  ode with WAL.  F
21210 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
21220 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69  he WAL.** file i
21230 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  s synced followi
21240 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ng each commit o
21250 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64  peration, in add
21260 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ition to the.** 
21270 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64  syncs associated
21280 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a   with NORMAL..**
21290 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75  .** Do not confu
212a0 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  se synchronous=F
212b0 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ULL with SQLITE_
212c0 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a  SYNC_FULL.  The.
212d0 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  ** SQLITE_SYNC_F
212e0 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20  ULL macro means 
212f0 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53  to use the MacOS
21300 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79  X-style full-fsy
21310 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74  nc.** using fcnt
21320 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20  l(F_FULLFSYNC). 
21330 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
21340 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  MAL means to do 
21350 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66  an.** ordinary f
21360 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68  sync() call.  Th
21370 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
21380 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c  ence between SQL
21390 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a  ITE_SYNC_FULL.**
213a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43   and SQLITE_SYNC
213b0 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66  _NORMAL on platf
213c0 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20  orms other than 
213d0 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65  MacOSX.  But the
213e0 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  .** synchronous=
213f0 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63  FULL versus sync
21400 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73  hronous=NORMAL s
21410 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65  etting determine
21420 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53  s when.** the xS
21430 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73  ync primitive is
21440 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72   called and is r
21450 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70  elevant to all p
21460 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  latforms..**.** 
21470 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
21480 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
21490 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
214a0 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
214b0 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
214c0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
214d0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
214e0 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
214f0 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
21500 4c 65 76 65 6c 28 0a 20 20 50 61 67 65 72 20 2a  Level(.  Pager *
21510 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
21520 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73  * The pager to s
21530 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  et safety level 
21540 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76  for */.  int lev
21550 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  el,            /
21560 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
21570 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
21580 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
21590 2f 20 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46  /  .  int bFullF
215a0 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50  sync,       /* P
215b0 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20  RAGMA fullfsync 
215c0 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 75  */.  int bCkptFu
215d0 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 52  llFsync    /* PR
215e0 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f  AGMA checkpoint_
215f0 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a  fullfsync */.){.
21600 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
21610 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
21620 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
21630 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20  nc =  (level==1 
21640 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
21650 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
21660 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
21670 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50  (level==3 && !pP
21680 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
21690 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67  ?1:0;.  if( pPag
216a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
216b0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
216c0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ags = 0;.    pPa
216d0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
216e0 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
216f0 69 66 28 20 62 46 75 6c 6c 46 73 79 6e 63 20 29  if( bFullFsync )
21700 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
21710 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
21720 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20  _SYNC_FULL;.    
21730 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
21740 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
21750 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
21760 65 20 69 66 28 20 62 43 6b 70 74 46 75 6c 6c 46  e if( bCkptFullF
21770 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  sync ){.    pPag
21780 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
21790 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
217a0 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
217b0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
217c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
217d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
217e0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
217f0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21800 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
21810 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21820 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21830 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ORMAL;.  }.}.#en
21840 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
21850 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
21860 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
21870 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
21880 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
21890 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
218a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
218b0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
218c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
218d0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
218e0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
218f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
21900 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
21910 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
21920 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
21930 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
21940 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
21950 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
21960 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
21970 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
21980 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
21990 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
219a0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
219b0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
219c0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
219d0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
219e0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
219f0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
21a00 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
21a10 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
21a20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
21a30 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
21a40 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
21a50 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
21a60 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
21a70 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
21a80 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
21a90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
21aa0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
21ab0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
21ac0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21ad0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
21ae0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
21af0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
21b00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
21b10 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
21b20 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
21b30 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
21b40 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
21b50 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
21b60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
21b70 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
21b80 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
21b90 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
21ba0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
21bb0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
21bc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21be0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
21bf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
21c00 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
21c10 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
21c20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
21c30 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
21c40 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
21c50 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
21c60 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
21c70 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
21c80 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
21c90 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
21ca0 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
21cb0 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
21cc0 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K)|.#endif.     
21cd0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
21ce0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
21cf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
21d00 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
21d10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
21d20 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
21d30 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
21d40 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
21d50 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
21d60 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
21d70 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
21d80 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21d90 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
21da0 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
21db0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21dc0 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
21dd0 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
21de0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
21df0 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
21e00 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
21e10 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
21e20 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
21e30 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
21e40 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
21e50 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
21e60 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
21e70 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
21e80 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
21e90 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
21ea0 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
21eb0 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
21ec0 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
21ed0 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
21ee0 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
21ef0 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
21f00 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
21f10 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
21f20 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
21f30 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
21f40 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
21f50 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
21f60 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
21f70 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
21fa0 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
21fb0 2d 2d 2d 2d 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 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
21ff0 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
22000 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
22010 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
22020 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
22030 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
22040 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
22050 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
22060 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
22070 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
22080 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
22090 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
220a0 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
220b0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
220c0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
220d0 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
220e0 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
220f0 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
22100 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
22110 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
22120 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
22130 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
22140 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
22150 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22160 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
22170 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
22180 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
22190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
221a0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
221b0 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
221c0 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
221d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
221e0 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
221f0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
22200 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
22210 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
22220 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
22230 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
22240 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20  ndler */.){  .  
22250 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
22260 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
22270 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
22280 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
22290 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
222a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
222b0 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
222c0 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
222d0 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
222e0 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
222f0 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
22300 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
22310 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
22320 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
22330 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
22340 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
22350 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
22360 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
22370 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
22380 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
22390 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
223a0 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
223b0 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
223c0 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f  R_xxx sub-code o
223d0 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
223e0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
223f0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
22400 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
22410 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
22420 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
22430 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
22440 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
22450 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
22460 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
22470 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
22480 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
22490 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
224a0 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
224b0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
224c0 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
224d0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
224e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
224f0 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
22500 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
22510 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
22520 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
22530 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
22540 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
22550 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
22560 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
22570 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
22580 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
22590 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
225a0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
225b0 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
225c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
225d0 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
225e0 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
225f0 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
22600 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
22610 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
22620 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
22630 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
22640 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
22650 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
22660 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
22670 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
22680 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
22690 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
226a0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
226b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
226c0 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
226d0 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
226e0 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
226f0 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
22700 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
22710 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
22720 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
22730 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
22740 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
22750 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
22760 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
22770 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
22780 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
22790 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
227a0 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
227b0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
227c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
227d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
227e0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
227f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33  ager *pPager, u3
22800 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  2 *pPageSize, in
22810 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
22820 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22830 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  K;..  /* It is n
22840 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
22850 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f  o a full assert_
22860 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65  pager_state() he
22870 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a  re, as this.  **
22880 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
22890 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
228a0 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c  hin PagerOpen(),
228b0 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
228c0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61  e.  ** of the Pa
228d0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  ger object is in
228e0 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
228f0 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ent..  **.  ** A
22900 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
22910 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
22920 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
22930 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
22940 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f  .  ** PAGER_ERRO
22950 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e  R state. But sin
22960 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ce PAGER_ERROR s
22970 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20  tate guarantees 
22980 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20  that.  ** there 
22990 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  is at least one 
229a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
229b0 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73   reference, this
229c0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
229d0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68  s a no-op for th
229e0 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a  at case anyhow..
229f0 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65    */..  u32 page
22a00 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
22a10 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
22a20 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
22a30 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
22a40 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
22a50 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
22a60 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
22a70 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
22a80 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
22a90 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
22aa0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22ab0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
22ac0 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
22ad0 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32  & pageSize!=(u32
22ae0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
22af0 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  e .  ){.    char
22b00 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20   *pNew = NULL;  
22b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
22b20 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a  w temp space */.
22b30 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20      i64 nByte = 
22b40 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  0;..    if( pPag
22b50 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
22b60 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28  _OPEN && isOpen(
22b70 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
22b80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22b90 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
22ba0 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b  er->fd, &nByte);
22bb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22bd0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
22be0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
22bf0 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
22c00 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
22c10 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  w ) rc = SQLITE_
22c20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
22c30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
22c50 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
22c60 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
22c70 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28  dbSize = (Pgno)(
22c80 6e 42 79 74 65 2f 70 61 67 65 53 69 7a 65 29 3b  nByte/pageSize);
22c90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
22ca0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
22cb0 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
22cc0 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
22cd0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
22ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
22cf0 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
22d00 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
22d10 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
22d20 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
22d30 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
22d40 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65   }..  *pPageSize
22d50 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
22d60 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ize;.  if( rc==S
22d70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22d80 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
22d90 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
22da0 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
22db0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
22dc0 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
22dd0 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
22de0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
22df0 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
22e00 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
22e10 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
22e20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22e30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
22e40 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
22e50 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
22e60 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
22e70 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
22e80 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
22e90 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
22ea0 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
22eb0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
22ec0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
22ed0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
22ee0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
22ef0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
22f00 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
22f10 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
22f20 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
22f30 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
22f40 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
22f50 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
22f60 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
22f70 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
22f80 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
22f90 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
22fa0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
22fb0 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
22fc0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
22fd0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
22fe0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
22ff0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
23000 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
23010 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
23020 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
23030 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
23040 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
23050 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
23060 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
23070 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
23080 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
23090 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
230a0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
230b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
230c0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
230d0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
230e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
230f0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
23100 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23110 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
23120 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
23130 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
23140 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
23150 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
23160 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
23170 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23180 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
23190 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
231a0 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
231b0 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
231c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
231d0 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
231e0 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
231f0 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
23200 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
23210 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
23220 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
23230 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
23240 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
23250 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
23260 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
23270 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
23280 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
23290 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
232a0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
232b0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
232c0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
232d0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
232e0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
232f0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
23300 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
23310 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
23320 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
23330 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
23340 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
23350 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
23360 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
23370 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
23380 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
23390 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
233a0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
233b0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
233c0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
233d0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
233e0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
233f0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
23400 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
23410 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
23420 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
23430 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
23440 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
23450 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
23460 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
23470 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
23480 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
23490 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
234a0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
234b0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
234c0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
234d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
234e0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
234f0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
23500 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
23510 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
23520 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
23530 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
23540 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
23550 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
23560 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
23570 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
23580 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
23590 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
235a0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
235b0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
235c0 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
235d0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
235e0 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
235f0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
23600 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
23610 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
23620 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
23630 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
23640 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
23650 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
23660 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
23670 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
23680 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
23690 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
236a0 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
236b0 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
236c0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
236d0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
236e0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
236f0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
23700 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
23710 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
23720 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
23730 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
23740 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23750 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
23760 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23770 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
23780 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
23790 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
237a0 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
237b0 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
237c0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
237d0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
237e0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
237f0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
23800 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
23810 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
23820 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
23830 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
23840 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
23850 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
23860 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
23870 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
23880 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
23890 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
238a0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
238b0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
238c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
238d0 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
238e0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
238f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
23900 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
23910 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
23920 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
23930 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
23940 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
23950 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
23960 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23970 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23980 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23990 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
239a0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
239b0 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
239c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
239d0 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
239e0 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
239f0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
23a00 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
23a10 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
23a20 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
23a30 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
23a40 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
23a50 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
23a60 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
23a70 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
23a80 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
23a90 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
23aa0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
23ab0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
23ac0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
23ad0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
23ae0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
23af0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23b00 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
23b10 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
23b20 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
23b30 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
23b40 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
23b50 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
23b60 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
23b70 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
23b80 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
23b90 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
23ba0 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
23bb0 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
23bc0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
23bd0 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
23be0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
23bf0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
23c00 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
23c10 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
23c20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
23c30 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
23c40 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
23c50 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
23c60 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
23c70 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
23c80 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
23c90 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
23ca0 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
23cb0 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
23cc0 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
23cd0 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
23ce0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
23cf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
23d00 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
23d10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
23d20 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
23d30 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
23d40 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
23d50 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
23d60 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
23d70 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
23d80 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
23d90 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
23da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23db0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
23dc0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
23dd0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
23de0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  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 2f 2a 20 52 65 74 75 72          /* Retur
23e10 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
23e20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
23e30 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
23e40 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
23e50 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
23e60 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
23e70 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
23e80 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
23e90 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
23ea0 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
23eb0 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
23ec0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
23ed0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
23ee0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
23ef0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
23f00 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
23f10 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
23f20 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
23f30 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
23f40 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
23f50 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
23f60 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
23f70 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
23f80 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
23f90 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
23fa0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
23fb0 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
23fc0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
23fd0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
23fe0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
23ff0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
24000 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
24010 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
24020 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
24030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24040 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
24050 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24060 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
24070 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
24080 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
24090 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
240a0 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
240b0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
240c0 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
240d0 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
240e0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
240f0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
24100 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
24110 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
24120 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
24130 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
24140 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
24150 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
24160 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
24170 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
24180 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
24190 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
241a0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
241b0 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
241c0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
241d0 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
241e0 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
241f0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
24200 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
24210 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
24220 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
24230 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
24240 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
24250 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
24260 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
24270 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
24280 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
24290 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
242a0 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
242b0 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
242c0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
242d0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
242e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
242f0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
24300 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
24310 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
24320 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
24330 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
24340 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77  rect behaviour w
24350 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
24360 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
24370 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
24380 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
24390 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
243a0 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
243b0 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
243c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
243d0 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
243e0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
243f0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
24400 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
24410 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
24420 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
24430 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
24440 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
24450 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
24460 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
24470 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
24480 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
24490 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
244a0 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
244b0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
244c0 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
244d0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
244e0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
244f0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
24500 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
24510 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
24520 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
24530 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
24540 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
24550 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
24560 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
24570 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
24580 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
24590 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
245a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
245b0 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
245c0 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
245d0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
245e0 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
245f0 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
24600 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24610 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
24620 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
24630 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
24640 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
24650 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
24660 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
24670 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
24680 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
24690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
246a0 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
246b0 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
246c0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
246d0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
246e0 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
246f0 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
24700 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
24710 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
24720 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
24730 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
24740 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
24750 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
24760 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
24770 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
24780 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
24790 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
247a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
247b0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
247c0 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
247d0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
247e0 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63  e;.  assertTrunc
247f0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
24800 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ager);.}.../*.**
24810 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
24820 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
24830 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
24840 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
24850 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
24860 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
24870 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
24880 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
24890 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
248a0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
248b0 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
248c0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
248d0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
248e0 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
248f0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
24900 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
24910 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
24920 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
24930 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
24940 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
24950 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
24960 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
24970 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
24980 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
24990 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
249a0 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
249b0 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
249c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
249d0 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
249e0 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
249f0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
24a00 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
24a10 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
24a20 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
24a30 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
24a40 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
24a50 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
24a60 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
24a70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
24a80 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
24a90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24aa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24ab0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
24ac0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
24ad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24ae0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
24af0 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
24b00 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
24b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24b20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
24b30 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
24b40 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
24b50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
24b60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
24b80 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
24b90 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
24ba0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
24bb0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
24bc0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
24bd0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
24be0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
24bf0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
24c00 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
24c10 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
24c20 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
24c30 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
24c40 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
24c50 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
24c60 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
24c70 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
24c80 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
24c90 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
24ca0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
24cb0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
24cc0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
24cd0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
24ce0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
24cf0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
24d00 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
24d10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
24d20 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
24d30 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
24d40 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
24d50 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
24d60 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
24d70 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
24d80 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
24d90 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
24da0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
24db0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
24dc0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
24dd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24de0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
24df0 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54  Pager){.  u8 *pT
24e00 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  mp = (u8 *)pPage
24e10 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20  r->pTmpSpace;.. 
24e20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
24e30 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
24e40 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65  er) );.  disable
24e50 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
24e60 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
24e70 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
24e80 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  oc();.  /* pPage
24e90 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20  r->errCode = 0; 
24ea0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  */.  pPager->exc
24eb0 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
24ec0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24ed0 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65  MIT_WAL.  sqlite
24ee0 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
24ef0 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ->pWal, pPager->
24f00 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70  ckptSyncFlags, p
24f10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
24f20 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72   pTmp);.  pPager
24f30 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64  ->pWal = 0;.#end
24f40 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  if.  pager_reset
24f50 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
24f60 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
24f70 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
24f80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24f90 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e  /* If it is open
24fa0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
24fb0 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  al file before c
24fc0 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64  alling UnlockAnd
24fd0 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a  Rollback..    **
24fe0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
24ff0 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e  done, then an un
25000 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
25010 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
25020 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  al .    ** file 
25030 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61  may be played ba
25040 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
25050 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
25060 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
25070 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68  .    ** while th
25080 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
25090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
250a0 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
250b0 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  pt..    **.    *
250c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
250d0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
250e0 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f  g to sync the jo
250f0 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65  urnal, shift the
25100 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e   pager.    ** in
25110 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
25120 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  te. This causes 
25130 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
25140 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  k to unlock the.
25150 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
25160 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f  and close the jo
25170 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f  urnal file witho
25180 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ut attempting to
25190 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20   roll it.    ** 
251a0 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65  back or finalize
251b0 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61   it. The next da
251c0 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c  tabase user will
251d0 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d   have to do hot-
251e0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72  journal.    ** r
251f0 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61  ollback before a
25200 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
25210 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
25220 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  */.    if( isOpe
25230 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
25240 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
25250 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65  ror(pPager, page
25260 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
25270 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
25280 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
25290 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
252a0 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
252b0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
252c0 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
252d0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
252e0 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
252f0 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
25300 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
25310 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
25320 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
25330 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
25340 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
25350 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  d);.  sqlite3OsC
25360 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
25370 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
25380 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c  ree(pTmp);.  sql
25390 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
253a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
253b0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
253c0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
253d0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
253e0 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
253f0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
25400 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
25410 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
25420 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
25430 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
25440 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
25450 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
25460 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
25470 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
25480 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
25490 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
254a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
254b0 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
254c0 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
254d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
254e0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
254f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
25500 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
25510 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
25520 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
25530 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
25540 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
25550 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
25560 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
25570 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
25580 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
25590 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
255a0 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
255b0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
255c0 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
255d0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
255e0 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
255f0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
25600 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
25610 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
25620 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
25630 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
25640 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
25650 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
25660 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
25670 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
25680 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
25690 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
256a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
256b0 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
256c0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
256d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
256e0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
256f0 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
25700 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
25710 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
25720 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a  -mode and the .*
25730 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  * device charact
25740 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
25750 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
25760 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
25770 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
25780 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
25790 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
257a0 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
257b0 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
257c0 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
257d0 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
257e0 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
257f0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
25800 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
25810 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
25820 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
25830 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
25840 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
25850 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
25860 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
25870 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
25880 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
25890 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
258a0 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
258b0 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
258c0 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
258d0 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
258e0 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
258f0 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
25900 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
25910 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
25920 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
25930 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
25940 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
25950 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
25960 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
25970 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
25980 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
25990 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
259a0 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
259b0 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
259c0 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
259d0 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
259e0 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
259f0 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
25a00 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
25a10 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
25a20 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
25a30 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
25a40 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
25a50 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
25a60 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
25a70 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
25a80 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
25a90 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
25aa0 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
25ab0 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
25ac0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
25ad0 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
25ae0 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
25af0 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
25b00 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
25b10 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
25b20 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
25b30 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
25b40 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
25b50 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
25b60 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
25b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25b80 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
25b90 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
25ba0 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
25bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25bd0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
25be0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
25bf0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
25c00 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
25c10 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
25c20 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
25c30 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
25c40 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
25c50 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
25c60 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
25c70 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
25c80 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
25c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
25ca0 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
25cb0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
25cc0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
25cd0 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
25ce0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
25cf0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
25d00 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
25d10 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
25d20 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
25d30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
25d40 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
25d50 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
25d60 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
25d70 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
25d80 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25d90 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
25da0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25db0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
25dc0 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
25dd0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
25de0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
25df0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
25e00 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
25e10 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
25e20 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
25e30 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
25e40 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
25e50 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
25e60 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
25e70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
25e80 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
25e90 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
25ea0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
25eb0 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
25ec0 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
25ed0 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
25ee0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
25ef0 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
25f00 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
25f10 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
25f20 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
25f30 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
25f40 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
25f50 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
25f60 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
25f70 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
25f80 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
25f90 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
25fa0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
25fb0 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
25fc0 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
25fd0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
25fe0 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
25ff0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
26000 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
26010 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
26020 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
26030 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
26040 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
26050 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
26060 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
26070 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
26080 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
26090 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
260a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
260b0 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
260c0 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
260d0 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
260e0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
260f0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
26100 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
26110 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
26120 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
26130 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
26140 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
26150 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
26160 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
26170 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26180 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
26190 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
261a0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
261b0 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
261c0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
261d0 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
261e0 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
261f0 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
26200 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
26210 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
26220 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
26230 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
26240 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
26250 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26260 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
26270 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
26280 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
26290 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
262a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
262b0 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
262c0 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
262d0 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
262e0 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
262f0 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
26300 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
26310 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
26320 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
26330 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
26340 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
26350 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
26360 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
26370 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
26380 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
26390 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
263a0 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
263b0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
263c0 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
263d0 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
263e0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
263f0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
26400 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
26410 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
26420 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
26430 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
26440 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
26450 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
26460 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
26470 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
26480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26490 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
264a0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
264b0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
264c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
264d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
264e0 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
264f0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
26500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
26510 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
26520 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
26530 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26540 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
26550 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
26560 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
26570 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
26580 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26590 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
265a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
265b0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
265c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
265d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
265e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
265f0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
26600 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26610 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
26620 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
26630 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
26640 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
26650 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
26660 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
26670 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
26680 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
26690 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
266a0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
266b0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
266c0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
266d0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
266e0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
266f0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
26700 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
26710 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
26720 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
26730 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
26740 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
26750 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
26760 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
26770 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
26780 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
26790 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
267a0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
267b0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
267c0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
267d0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
267e0 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
267f0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
26800 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
26810 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
26820 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
26830 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
26840 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
26850 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
26860 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
26870 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
26880 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
26890 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
268a0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
268b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
268c0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
268d0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
268e0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
268f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26900 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
26910 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
26920 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
26930 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
26940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26950 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
26960 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
26970 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
26980 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
26990 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
269a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
269b0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
269c0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
269d0 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
269e0 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
269f0 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
26a00 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
26a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
26a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26a30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
26a40 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
26a50 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
26a60 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
26a70 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
26a80 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
26a90 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
26aa0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
26ab0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
26ac0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
26ad0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
26ae0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26af0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
26b00 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
26b10 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
26b20 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
26b30 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
26b40 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
26b50 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
26b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26b70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26b80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26b90 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
26ba0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
26bb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
26bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
26bd0 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
26be0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
26bf0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
26c00 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
26c10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
26c20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
26c30 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
26c40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26c50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26c60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
26c70 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
26c80 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
26c90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26ca0 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
26cb0 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
26cc0 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
26cd0 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
26ce0 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
26cf0 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
26d00 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
26d10 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
26d20 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
26d30 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
26d40 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
26d50 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
26d60 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
26d70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
26d80 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
26d90 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
26da0 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
26db0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
26dc0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
26dd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26de0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
26df0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
26e00 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
26e10 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
26e20 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
26e30 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
26e40 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
26e50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
26e60 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
26e70 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
26e80 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
26e90 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
26ea0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
26eb0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
26ec0 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
26ed0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
26ee0 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
26ef0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26f00 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
26f10 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
26f20 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
26f30 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
26f40 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
26f50 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
26f60 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
26f70 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
26f80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
26f90 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
26fa0 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
26fb0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
26fc0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
26fd0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
26fe0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
26ff0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
27000 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
27010 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
27020 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
27030 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
27040 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
27050 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
27060 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
27070 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
27080 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
27090 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
270a0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
270b0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
270c0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
270d0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
270e0 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
270f0 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
27100 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
27110 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
27120 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
27130 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
27140 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
27150 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
27160 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
27170 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
27180 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
27190 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
271a0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
271b0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
271c0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
271d0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
271e0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
271f0 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
27200 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
27210 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
27220 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
27230 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
27240 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
27250 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
27260 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
27270 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
27280 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
27290 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
272a0 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
272b0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
272c0 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
272d0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
272e0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
272f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
27300 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
27310 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
27320 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
27330 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
27340 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
27350 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
27360 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
27370 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
27380 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
27390 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
273a0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
273b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
273c0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
273d0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
273e0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
273f0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
27400 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27430 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
27440 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
27450 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
27460 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
27470 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
27480 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
27490 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
274a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
274b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
274c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
274d0 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
274e0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
274f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
27500 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
27510 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
27520 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
27530 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
27540 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
27550 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
27560 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
27570 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
27580 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
27590 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
275a0 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
275b0 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
275c0 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
275d0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
275e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
275f0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
27600 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
27610 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
27620 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
27630 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
27640 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
27650 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
27660 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
27670 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
27680 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
27690 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
276a0 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
276b0 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
276c0 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
276d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
276e0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
276f0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
27700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27710 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
27720 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
27730 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ze ){.    sqlite
27740 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
27750 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27760 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
27770 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
27780 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
27790 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
277a0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
277b0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
277c0 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
277d0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
277e0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
277f0 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
27800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
27810 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
27820 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
27830 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
27840 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
27850 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
27860 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
27870 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
27880 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
27890 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
278a0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
278b0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
278c0 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
278d0 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
278e0 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
278f0 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
27900 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
27910 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
27920 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
27930 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
27940 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
27950 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
27960 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
27970 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
27980 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
27990 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
279a0 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
279b0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
279c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
279d0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
279e0 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
279f0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
27a00 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
27a10 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
27a20 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
27a30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
27a40 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
27a50 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
27a60 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *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 2f 2a                /*
27a90 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
27aa0 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
27ab0 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
27ac0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
27ad0 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
27ae0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
27af0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
27b00 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
27b10 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  List);..      /*
27b20 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
27b30 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
27b40 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
27b50 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
27b60 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
27b70 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
27b80 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
27b90 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
27ba0 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
27bb0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
27bc0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
27bd0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
27be0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
27bf0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
27c00 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
27c10 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
27c20 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
27c30 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
27c40 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
27c50 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
27c60 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
27c70 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
27c80 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
27c90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27ca0 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
27cb0 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
27cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
27cd0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
27ce0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
27cf0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
27d00 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
27d10 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
27d20 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
27d30 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
27d40 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
27d50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
27d60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
27d70 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
27d80 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  }..      /* Upda
27d90 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
27da0 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
27db0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
27dc0 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
27dd0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
27de0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
27df0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
27e00 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
27e10 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
27e20 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
27e30 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
27e40 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
27e50 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
27e60 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
27e70 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
27e80 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
27e90 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
27ea0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
27eb0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
27ec0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
27ed0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
27ee0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41  count);.      PA
27ef0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
27f00 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65  >nWrite);.    }e
27f10 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
27f20 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
27f30 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
27f40 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
27f50 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
27f60 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
27f70 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
27f80 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
27f90 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
27fa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27fb0 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
27fc0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
27fd0 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
27fe0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
27ff0 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
28000 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
28010 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
28020 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
28030 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
28040 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
28050 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
28060 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
28070 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
28080 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
28090 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
280a0 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
280b0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
280c0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
280d0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
280e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
280f0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
28100 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
28110 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
28120 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
28130 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
28140 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
28150 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
28160 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
28170 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
28180 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  ->sjfd);.    }el
28190 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
281a0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
281b0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  ger, pPager->sjf
281c0 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d, SQLITE_OPEN_S
281d0 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
281e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
281f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  c;.}../*.** Appe
28200 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74  nd a record of t
28210 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
28220 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20   of page pPg to 
28230 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
28240 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63   .** It is the c
28250 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
28260 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62  ility to use sub
28270 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20  jRequiresPage() 
28280 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61  to check .** tha
28290 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  t it is really r
282a0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63  equired before c
282b0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
282c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tion..**.** If s
282d0 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
282e0 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
282f0 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e  ding to pPg->pgn
28300 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73  o in the bitvecs
28310 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e  .** for all open
28320 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f   savepoints befo
28330 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
28340 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
28350 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
28360 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
28370 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
28380 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
28390 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65  code if the atte
283a0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
283b0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
283c0 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51  fails, or .** SQ
283d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
283e0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69  malloc fails whi
283f0 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74  le setting a bit
28400 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a   in a savepoint.
28410 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74  ** bitvec..*/.st
28420 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
28430 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70  nalPage(PgHdr *p
28440 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
28450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
28460 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
28470 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
28480 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
28490 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
284a0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20  ALMODE_OFF ){.. 
284b0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73     /* Open the s
284c0 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  ub-journal, if i
284d0 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
284e0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f  y been opened */
284f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28500 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
28510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
28520 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
28530 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  d) || pagerUseWa
28540 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
28550 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
28560 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c  pPager->sjfd) ||
28570 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
28580 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
28590 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
285a0 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20  Pager) .        
285b0 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61   || pageInJourna
285c0 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  l(pPg) .        
285d0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
285e0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
285f0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
28600 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
28610 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
28620 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
28630 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
28640 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
28650 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
28660 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
28670 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
28680 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
28690 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
286a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
286b0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
286c0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
286d0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
286e0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
286f0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
28700 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
28710 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a  har *pData2;.  .
28720 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
28730 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
28740 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
28750 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
28760 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41  Data2);.      PA
28770 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
28780 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
28790 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
287a0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
287b0 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
287c0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
287d0 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
287e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
287f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
28820 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
28830 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
28840 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
28850 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
28860 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
28870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28880 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
28890 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
288a0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
288b0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
288c0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
288d0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
288e0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
288f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28900 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
28910 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
28920 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
28930 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
28940 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
28950 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
28960 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
28970 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
28980 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
28990 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
289a0 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
289b0 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
289c0 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
289d0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
289e0 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
289f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
28a00 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
28a10 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
28a20 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
28a30 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
28a40 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
28a50 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
28a60 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
28a70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
28a80 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
28a90 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
28aa0 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
28ab0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
28ac0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
28ad0 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
28ae0 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
28af0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
28b00 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
28b10 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
28b20 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
28b30 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
28b40 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
28b50 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
28b60 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
28b70 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
28b80 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
28b90 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
28ba0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
28bb0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
28bc0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
28bd0 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
28be0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
28bf0 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
28c00 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
28c10 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
28c20 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
28c30 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
28c40 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
28c50 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
28c60 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
28c70 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
28c80 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
28c90 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
28ca0 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
28cb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
28cc0 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
28cd0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
28ce0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
28cf0 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
28d00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
28d10 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
28d20 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
28d30 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
28d40 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
28d50 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
28d60 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c  oNotSyncSpill fl
28d70 61 67 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  ag is set during
28d80 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e   times when doin
28d90 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a  g a sync of.  **
28da0 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64   journal (and ad
28db0 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65  ding a new heade
28dc0 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  r) is not allowe
28dd0 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a  d.  This occurs.
28de0 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c    ** during call
28df0 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
28e00 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74  rWrite() while t
28e10 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c  rying to journal
28e20 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70   multiple.  ** p
28e30 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74  ages belonging t
28e40 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  o the same secto
28e50 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
28e60 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67   doNotSpill flag
28e70 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
28e80 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65 67  che spilling reg
28e90 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
28ea0 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61  er.  ** or not a
28eb0 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
28ec0 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20  d.  This is set 
28ed0 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
28ee0 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69  k..  **.  ** Spi
28ef0 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72  lling is also pr
28f00 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e  ohibited when in
28f10 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
28f20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64  since that could
28f30 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61  .  ** lead to da
28f40 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
28f50 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72  n.   In the curr
28f60 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f  ent implementato
28f70 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d  n it .  ** is im
28f80 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c  possible for sql
28f90 69 74 65 33 50 43 61 63 68 65 46 65 74 63 68 28  ite3PCacheFetch(
28fa0 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77  ) to be called w
28fb0 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
28fc0 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20  1.  ** while in 
28fd0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
28fe0 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70   hence it is imp
28ff0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
29000 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a   routine to.  **
29010 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68   be called in th
29020 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20  e error state.  
29030 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65  Nevertheless, we
29040 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52   include a NEVER
29050 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72  ().  ** test for
29060 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
29070 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20   as a safeguard 
29080 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63  against future c
29090 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  hanges..  */.  i
290a0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
290b0 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
290c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
290d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
290e0 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20  tSpill ) return 
290f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
29100 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
29110 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d  ncSpill && (pPg-
29120 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
29130 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a  EED_SYNC)!=0 ){.
29140 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29150 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  E_OK;.  }..  pPg
29160 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
29170 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
29180 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
29190 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65  * Write a single
291a0 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20   frame for this 
291b0 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e  page to the log.
291c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
291d0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
291e0 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d  ) ){ .      rc =
291f0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
29200 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20  pPg); .    }.   
29210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29220 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
29230 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
29240 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20  pPager, pPg, 0, 
29250 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
29260 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
29270 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
29280 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
29290 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
292a0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
292b0 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
292c0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
292d0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
292e0 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
292f0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
29300 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
29310 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
29320 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
29330 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
29340 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
29350 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
29360 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
29370 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
29380 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
29390 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
293a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
293b0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
293c0 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
293d0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
293e0 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
293f0 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63  ll not.    ** ac
29400 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
29410 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
29420 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
29430 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64  **.    ** Consid
29440 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
29450 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
29460 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nts:.    **.    
29470 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  **   BEGIN;.    
29480 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
29490 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
294a0 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20     <modify page 
294b0 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41  X>.    **     SA
294c0 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20  VEPOINT sp;.    
294d0 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
294e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
294f0 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a  o Y pages>.    *
29500 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72  *       pagerStr
29510 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20  ess(page X).    
29520 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
29530 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20  TO sp;.    **.  
29540 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
29550 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
29560 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
29570 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
29580 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
29590 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
295a0 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
295b0 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
295c0 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
295d0 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  hen,.    ** foll
295e0 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42  owing the "ROLLB
295f0 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65  ACK TO sp" state
29600 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61  ment, reading pa
29610 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20  ge X will read. 
29620 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20     ** data from 
29630 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29640 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
29650 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
29660 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20   X as it.    ** 
29670 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
29680 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
29690 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
296a0 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
296b0 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  sp".    ** was e
296c0 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  xecuted..    **.
296d0 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
296e0 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
296f0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
29700 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
29710 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
29720 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
29730 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
29740 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
29750 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
29760 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72      ** be restor
29770 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
29780 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
29790 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
297a0 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65  " is .    ** exe
297b0 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cuted..    */.  
297c0 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20    if( NEVER(.   
297d0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
297e0 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e  OK && pPg->pgno>
297f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
29800 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
29810 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b  ge(pPg).    ) ){
29820 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
29830 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
29840 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
29850 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
29860 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
29870 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
29880 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
29890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
298a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
298b0 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
298c0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
298d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
298e0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
298f0 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
29900 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
29910 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
29920 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
29930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29940 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
29950 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
29960 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
29970 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29980 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
29990 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
299a0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
299b0 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
299c0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
299d0 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  c); .}.../*.** A
299e0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
299f0 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
29a00 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
29a10 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
29a20 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
29a30 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
29a40 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
29a50 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
29a60 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
29a70 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
29a80 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
29a90 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
29aa0 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
29ab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29ac0 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
29ad0 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
29ae0 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
29af0 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
29b00 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
29b10 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
29b20 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
29b30 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
29b40 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
29b50 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
29b60 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
29b70 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
29b80 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
29b90 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
29ba0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
29bb0 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
29bc0 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
29bd0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
29be0 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
29bf0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
29c00 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
29c10 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
29c20 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
29c30 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
29c40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
29c50 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
29c60 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
29c70 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
29c80 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
29c90 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
29ca0 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
29cb0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
29cc0 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
29cd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
29ce0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65   argument is use
29cf0 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f  d to specify pro
29d00 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66  perties that aff
29d10 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  ect the.** opera
29d20 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
29d30 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  r. It should be 
29d40 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77  passed some bitw
29d50 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a  ise combination.
29d60 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  ** of the PAGER_
29d70 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
29d80 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
29d90 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  CK flags..**.** 
29da0 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
29db0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
29dc0 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
29dd0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
29de0 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
29df0 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
29e00 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
29e10 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
29e20 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
29e30 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
29e40 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
29e50 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
29e60 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
29e70 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
29e80 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
29e90 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
29ea0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
29eb0 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
29ec0 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
29ed0 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
29ee0 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
29ef0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
29f00 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
29f10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
29f20 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
29f30 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
29f40 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
29f50 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
29f60 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
29f70 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
29f80 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
29f90 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
29fa0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
29fb0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
29fc0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
29fd0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
29fe0 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
29ff0 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2a000 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2a010 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2a020 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2a030 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2a040 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2a050 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2a060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a070 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2a080 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2a090 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2a0a0 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2a0b0 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2a0c0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2a0d0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2a0e0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2a0f0 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2a100 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2a110 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2a120 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2a130 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2a140 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2a150 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2a160 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2a170 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2a180 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2a190 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2a1a0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2a1b0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2a1c0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2a1d0 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2a1e0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2a1f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a200 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a210 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2a220 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2a230 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2a240 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2a250 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2a260 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2a270 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2a280 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2a290 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2a2a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2a2b0 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2a2c0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2a2d0 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2a2e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2a2f0 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2a300 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2a310 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2a320 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2a330 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2a340 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2a350 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2a360 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2a370 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2a380 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a390 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2a3a0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2a3b0 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2a3c0 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2a3d0 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2a3e0 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2a3f0 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52  nal */.  int noR
2a400 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
2a410 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
2a420 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72  LOCK)!=0;  /* Tr
2a430 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d  ue to omit read-
2a440 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63  lock */.  int pc
2a450 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2a460 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2a470 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2a480 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2a490 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2a4a0 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2a4b0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2a4c0 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2a4d0 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2a4e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2a4f0 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2a500 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2a510 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2a520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a530 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2a540 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2a550 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2a560 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2a570 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2a580 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2a590 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2a5a0 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2a5b0 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2a5c0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2a5d0 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2a5e0 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
2a5f0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
2a600 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
2a610 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
2a620 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2a630 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
2a640 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2a650 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
2a660 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
2a670 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
2a680 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
2a690 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
2a6a0 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
2a6b0 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
2a6c0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
2a6d0 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
2a6e0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
2a6f0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2a700 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
2a710 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
2a720 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
2a730 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
2a740 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
2a750 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2a760 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
2a770 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2a780 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
2a790 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
2a7a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
2a7b0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2a7c0 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
2a7d0 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
2a7e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2a7f0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2a800 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2a810 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2a820 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2a830 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2a840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2a850 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2a860 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2a870 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2a880 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  1;.    zFilename
2a890 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2a8a0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2a8b0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2a8c0 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2a8d0 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2a8e0 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2a8f0 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2a900 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2a910 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2a920 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2a930 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2a940 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2a950 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2a960 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2a970 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2a980 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2a990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2a9a0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2a9b0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2a9c0 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2a9d0 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
2a9e0 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  c(nPathname*2);.
2a9f0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2aa00 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2aa10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2aa20 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  M;.    }.    zPa
2aa30 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2aa40 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2aa50 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2aa60 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2aa70 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2aa80 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2aa90 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2aaa0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2aab0 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2aac0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2aad0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2aae0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2aaf0 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2ab00 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2ab10 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2ab20 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2ab30 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2ab40 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2ab50 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2ab60 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2ab70 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2ab80 20 6e 55 72 69 20 3d 20 26 7a 5b 31 5d 20 2d 20   nUri = &z[1] - 
2ab90 7a 55 72 69 3b 0a 20 20 20 20 69 66 28 20 72 63  zUri;.    if( rc
2aba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2abb0 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
2abc0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
2abd0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2abe0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
2abf0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
2ac00 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
2ac10 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2ac20 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
2ac30 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
2ac40 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
2ac50 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
2ac60 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
2ac70 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
2ac80 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
2ac90 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
2aca0 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
2acb0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2acc0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
2acd0 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
2ace0 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
2acf0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
2ad00 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
2ad10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2ad20 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2ad30 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2ad40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ad50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2ad60 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
2ad70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
2ad80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2ad90 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
2ada0 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
2adb0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
2adc0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
2add0 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
2ade0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2adf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ae00 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
2ae10 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
2ae20 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
2ae30 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
2ae40 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2ae50 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
2ae60 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2ae70 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
2ae80 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
2ae90 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
2aea0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2aeb0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2aec0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
2aed0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2aee0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
2aef0 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
2af00 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
2af10 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
2af20 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2af30 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
2af40 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2af50 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2af60 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
2af70 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2af80 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2af90 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2afa0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
2afb0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2afc0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
2afd0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
2afe0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2b000 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
2b010 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
2b020 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
2b030 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
2b040 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2b050 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
2b060 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2b070 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2b080 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
2b090 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
2b0a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
2b0b0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2b0c0 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
2b0d0 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
2b0e0 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
2b0f0 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
2b100 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2b110 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
2b120 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
2b130 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20  me + 1 + nUri + 
2b140 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2b150 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
2b160 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
2b170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
2b180 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
2b190 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2b1a0 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
2b1b0 65 20 2b 20 34 20 2b 20 31 20 20 20 20 20 20 20  e + 4 + 1       
2b1c0 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
2b1d0 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
2b1e0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2b1f0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
2b200 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
2b210 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
2b220 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
2b230 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2b240 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
2b250 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b260 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
2b270 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
2b280 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
2b290 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
2b2a0 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
2b2b0 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  che*)(pPtr += RO
2b2c0 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2b2d0 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72  ger)));.  pPager
2b2e0 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65  ->fd =   (sqlite
2b2f0 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2b300 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2b310 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ze));.  pPager->
2b320 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
2b330 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2b340 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2b350 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72  File));.  pPager
2b360 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65  ->jfd =  (sqlite
2b370 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2b380 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2b390 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
2b3a0 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61  lename =    (cha
2b3b0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  r*)(pPtr += jour
2b3c0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2b3d0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2b3e0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61  TE_ALIGNMENT(pPa
2b3f0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
2b400 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50  /* Fill in the P
2b410 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61  ager.zFilename a
2b420 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
2b430 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65  l buffers, if re
2b440 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
2b450 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
2b460 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e    assert( nPathn
2b470 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61  ame>0 );.    pPa
2b480 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
2b490 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2b4a0 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20  = nPathname + 1 
2b4b0 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  + nUri);.    mem
2b4c0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
2b4d0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
2b4e0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2b4f0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2b500 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2b510 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2b520 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2b530 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2b540 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2b550 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2b560 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2b570 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2b580 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
2b590 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  8);.    sqlite3F
2b5a0 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2b5b0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2b5c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2b5d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b5e0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2b5f0 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2b600 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2b610 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2b620 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2b630 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2b640 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2b650 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2b660 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2b670 5d 2c 20 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20  ], "-wal", 4);. 
2b680 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2b690 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2b6a0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2b6b0 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2b6c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b6d0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2b6e0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2b6f0 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2b700 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2b710 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2b720 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2b730 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2b740 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2b750 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2b760 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b780 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2b790 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2b7a0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2b7b0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2b7c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b7d0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2b7e0 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2b7f0 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2b800 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2b810 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2b820 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2b830 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b840 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2b850 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2b860 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2b870 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2b880 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2b890 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2b8a0 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2b8b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2b8c0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2b8d0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2b8e0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2b8f0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2b900 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2b910 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2b920 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2b930 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2b940 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2b950 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2b960 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2b970 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2b980 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2b990 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2b9a0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b9b0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
2b9c0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65  Only ){.      se
2b9d0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2b9e0 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
2b9f0 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
2ba00 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
2ba10 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2ba20 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
2ba30 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2ba40 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2ba50 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
2ba60 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2ba70 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2ba80 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2ba90 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2baa0 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2bab0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2bac0 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2bad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bae0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2baf0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63  (u32)pPager->sec
2bb00 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
2bb10 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
2bb20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2bb30 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2bb40 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74     {.        int
2bb50 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
2bb60 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2bb70 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
2bb80 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2bb90 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
2bba0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2bbb0 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2bbc0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
2bbd0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2bbe0 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2bbf0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2bc00 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
2bc10 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2bc20 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
2bc30 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2bc40 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2bc50 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2bc60 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2bc70 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  *2){.          i
2bc80 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2bc90 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2bca0 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2bcb0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2bcc0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
2bcd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bce0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2bcf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2bd00 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2bd10 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2bd20 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2bd30 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2bd40 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2bd50 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2bd60 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2bd70 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2bd80 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2bd90 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2bda0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2bdb0 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2bdc0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2bdd0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2bde0 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2bdf0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2be00 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2be10 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2be20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2be30 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2be40 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2be50 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2be60 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2be70 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2be80 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2be90 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
2bea0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2beb0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2bec0 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
2bed0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2bee0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
2bef0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2bf00 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2bf10 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2bf20 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2bf30 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2bf40 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2bf50 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2bf60 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2bf70 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2bf80 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2bf90 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2bfa0 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2bfb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2bfc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2bfd0 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2bfe0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2bff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2c000 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2c010 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2c020 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2c030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c040 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2c050 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2c060 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
2c070 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
2c080 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  free the .  ** P
2c090 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
2c0a0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
2c0b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
2c0c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c0d0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2c0e0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b  er->pTmpSpace );
2c0f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2c100 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2c110 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2c120 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2c130 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2c140 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2c150 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2c160 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
2c170 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2c180 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2c190 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
2c1a0 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
2c1b0 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
2c1c0 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
2c1e0 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
2c1f0 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
2c200 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
2c210 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
2c220 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2c230 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2c240 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2c250 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2c260 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2c270 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2c280 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2c290 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2c2a0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2c2b0 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2c2c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
2c2d0 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64  adlock = (noRead
2c2e0 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
2c2f0 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61  ) ?1:0;.  /* pPa
2c300 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
2c310 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2c320 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
2c330 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2c340 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
2c350 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2c360 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2c370 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
2c380 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2c390 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
2c3a0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2c3b0 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
2c3c0 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
2c3d0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2c3e0 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
2c3f0 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  CK; */.#if 0.  a
2c400 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2c410 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
2c420 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
2c430 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
2c440 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  CK) );.#endif.  
2c450 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
2c460 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
2c470 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
2c480 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
2c490 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
2c4a0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2c4b0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
2c4c0 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
2c4d0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2c4e0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2c4f0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2c500 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2c510 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
2c520 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2c530 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
2c540 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
2c550 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2c560 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2c570 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
2c580 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
2c590 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2c5a0 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
2c5b0 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
2c5c0 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
2c5d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2c5e0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
2c5f0 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
2c600 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2c610 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65  fullSync = pPage
2c620 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a  r->noSync ?0:1;.
2c630 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
2c640 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ags = pPager->no
2c650 53 79 6e 63 20 3f 20 30 20 3a 20 53 51 4c 49 54  Sync ? 0 : SQLIT
2c660 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 23  E_SYNC_NORMAL;.#
2c670 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
2c680 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a  T_CKPTFULLFSYNC.
2c690 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2c6a0 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
2c6b0 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 53  ->noSync ? 0 : S
2c6c0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
2c6d0 0a 23 65 6c 73 65 0a 20 20 70 50 61 67 65 72 2d  .#else.  pPager-
2c6e0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
2c6f0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2c700 67 73 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  gs;.#endif.  /* 
2c710 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2c720 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c730 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2c740 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c750 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2c760 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2c770 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2c780 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2c790 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2c7a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2c7b0 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2c7c0 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2c7d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2c7e0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
2c7f0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2c800 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
2c810 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2c820 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2c830 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2c840 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
2c850 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
2c860 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2c870 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2c880 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2c890 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
2c8a0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
2c8b0 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
2c8c0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
2c8d0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
2c8e0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
2c8f0 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
2c900 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
2c910 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
2c920 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2c930 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70  Hash)); */..  *p
2c940 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
2c950 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c960 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK;.}..../*.** 
2c970 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2c980 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72   called after tr
2c990 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
2c9a0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f   PAGER_UNLOCK to
2c9b0 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44  .** PAGER_SHARED
2c9c0 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73   state. It tests
2c9d0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
2c9e0 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65  ot journal prese
2c9f0 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c  nt in.** the fil
2ca00 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
2ca10 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20   given pager. A 
2ca20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
2ca30 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64  ne that .** need
2ca40 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
2ca50 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74  ack. According t
2ca60 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2ca70 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
2ca80 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66  * file exists if
2ca90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2caa0 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a  riteria are met:
2cab0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a  .**.**   * The j
2cac0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2cad0 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73  ts in the file s
2cae0 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20  ystem, and.**   
2caf0 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c  * No process hol
2cb00 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ds a RESERVED or
2cb10 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
2cb20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cb30 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  le, and.**   * T
2cb40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cb50 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74   itself is great
2cb60 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20  er than 0 bytes 
2cb70 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20  in size, and.** 
2cb80 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79    * The first by
2cb90 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  te of the journa
2cba0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2cbb0 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a  d is not 0x00..*
2cbc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
2cbd0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
2cbe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2cbf0 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
2cc00 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
2cc10 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
2cc20 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
2cc30 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
2cc40 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
2cc50 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
2cc60 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e name. In this 
2cc70 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
2cc80 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74   file is.** just
2cc90 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f   deleted using O
2cca0 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74  sDelete, *pExist
2ccb0 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  s is set to 0 an
2ccc0 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
2ccd0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
2cce0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2ccf0 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66  oes not check if
2cd00 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74   there is a mast
2cd10 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
2cd20 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ame.** at the en
2cd30 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49  d of the file. I
2cd40 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20  f there is, and 
2cd50 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  that master jour
2cd60 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73  nal file.** does
2cd70 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
2cd80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cd90 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2cda0 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  hot. In this.** 
2cdb0 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
2cdc0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  e will return a 
2cdd0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20  false-positive. 
2cde0 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
2cdf0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
2ce00 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
2ce10 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
2ce20 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2ce30 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69  y hot and .** wi
2ce40 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62  ll not roll it b
2ce50 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ack. .**.** If a
2ce60 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2ce70 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78  e is found to ex
2ce80 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ist, *pExists is
2ce90 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a   set to 1 and .*
2cea0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2ceb0 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d  rned. If no hot-
2cec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ced0 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74  present, *pExist
2cee0 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  s is.** set to 0
2cef0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
2cf00 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2cf10 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2cf20 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
2cf30 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
2cf40 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74  her or not a hot
2cf50 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78  -journal file ex
2cf60 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72  ists, the IO err
2cf70 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65  or.** code is re
2cf80 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2cf90 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73  alue of *pExists
2cfa0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
2cfb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2cfc0 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
2cfd0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
2cfe0 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74  Exists){.  sqlit
2cff0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
2d000 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
2d010 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
2d020 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d030 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d040 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73  de */.  int exis
2d050 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ts = 1;         
2d060 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2d070 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
2d080 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
2d090 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21  int jrnlOpen = !
2d0a0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2d0b0 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  jfd);..  assert(
2d0c0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2d0d0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
2d0e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2d0f0 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
2d100 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2d110 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a  =PAGER_OPEN );..
2d120 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70    assert( jrnlOp
2d130 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74  en==0 || ( sqlit
2d140 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2d150 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2d160 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c  ->jfd) &.    SQL
2d170 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
2d180 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a  TABLE_WHEN_OPEN.
2d190 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74    ));..  *pExist
2d1a0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72  s = 0;.  if( !jr
2d1b0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  nlOpen ){.    rc
2d1c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
2d1d0 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
2d1e0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2d1f0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2d200 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20   &exists);.  }. 
2d210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d220 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
2d230 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d      int locked =
2d240 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d250 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
2d260 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2d270 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
2d280 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
2d290 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
2d2a0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
2d2b0 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
2d2c0 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
2d2d0 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
2d2e0 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
2d2f0 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
2d300 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
2d310 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
2d320 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
2d330 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
2d340 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
2d350 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
2d360 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
2d370 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
2d380 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2d390 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
2d3a0 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
2d3b0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
2d3c0 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2d3d0 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
2d3e0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
2d3f0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
2d400 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
2d410 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
2d420 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2d430 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
2d440 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
2d450 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
2d460 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
2d470 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
2d480 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d490 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2d4a0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
2d4b0 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
2d4c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d4d0 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
2d4e0 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
2d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d500 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2d510 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
2d520 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  file */..      /
2d530 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65  * Check the size
2d540 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d550 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e   file. If it con
2d560 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73  sists of 0 pages
2d570 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
2d580 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2d590 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65  al file. See the
2d5a0 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
2d5b0 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20  above for .     
2d5c0 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e   ** the reasonin
2d5d0 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20  g here.  Delete 
2d5e0 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75  the obsolete jou
2d5f0 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a  rnal file under.
2d600 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52        ** a RESER
2d610 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69  VED lock to avoi
2d620 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  d race condition
2d630 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76  s and to avoid v
2d640 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a  iolating.      *
2d650 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20  * [H33020]..    
2d660 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2d670 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2d680 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
2d690 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d6a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d6b0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
2d6c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2d6d0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
2d6e0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2d6f0 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b     if( pagerLock
2d700 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
2d710 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54  VED_LOCK)==SQLIT
2d720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d730 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
2d740 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
2d750 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
2d760 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d770 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
2d780 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e  veMode ) pagerUn
2d790 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
2d7a0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
2d7b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d7c0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
2d7d0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
2d7e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d7f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
2d800 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2d810 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f   and no other co
2d820 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72  nnection has a r
2d830 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20  eserved.        
2d840 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20    ** or greater 
2d850 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2d860 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63  base file. Now c
2d870 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
2d880 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
2d890 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e  at least one non
2d8a0 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74  -zero bytes at t
2d8b0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2d8c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
2d8d0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2d8e0 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20  ere is, then we 
2d8f0 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f  consider this jo
2d900 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e  urnal to be hot.
2d910 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20   If not, .      
2d920 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
2d930 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
2d940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2d950 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2d960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2d970 74 20 66 20 3d 20 0a 23 69 66 20 53 51 4c 49 54  t f = .#if SQLIT
2d980 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
2d990 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20  OTECTION.       
2d9a0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
2d9b0 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
2d9c0 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
2d9d0 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
2d9e0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f.              
2d9f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2da00 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
2da10 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
2da20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2da30 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2da40 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2da50 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2da60 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
2da70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2da80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2da90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2daa0 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
2dab0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2dac0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
2dad0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
2dae0 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
2daf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2db00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
2db10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
2db20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2db30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2db40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2db50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
2db60 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
2db70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2db80 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2db90 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
2dba0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2dbb0 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
2dbc0 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
2dbd0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2dbe0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
2dbf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2dc00 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
2dc10 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
2dc20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
2dc30 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
2dc40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2dc50 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  ts has a zero he
2dc60 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
2dc70 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
2dc80 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
2dc90 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
2dca0 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
2dcb0 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
2dcc0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
2dcd0 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
2dce0 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
2dcf0 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
2dd00 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2dd10 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
2dd20 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2dd30 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
2dd40 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
2dd50 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
2dd60 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
2dd70 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
2dd80 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
2dd90 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
2dda0 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
2ddb0 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
2ddc0 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
2ddd0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2dde0 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
2ddf0 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
2de00 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
2de10 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
2de20 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
2de30 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2de40 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
2de50 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
2de60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2de70 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
2de80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2de90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2dea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2deb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2dec0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
2ded0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
2dee0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2def0 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
2df00 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
2df10 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
2df20 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74  uire() until aft
2df30 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
2df40 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63  .** has been suc
2df50 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64  cessfully called
2df60 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f  . If a shared-lo
2df70 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
2df80 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ld when.** this 
2df90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2dfa0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
2dfb0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  p..**.** The fol
2dfc0 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  lowing operation
2dfd0 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f  s are also perfo
2dfe0 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rmed by this fun
2dff0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31  ction..**.**   1
2e000 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
2e010 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
2e020 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
2e030 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
2e040 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
2e050 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
2e060 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2e070 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
2e080 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      SHARED 
2e090 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2e0a0 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64  base file. Immed
2e0b0 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
2e0c0 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
2e0d0 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
2e0e0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2e0f0 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
2e100 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
2e110 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
2e120 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
2e130 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
2e140 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
2e150 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
2e160 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
2e170 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
2e180 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
2e190 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
2e1a0 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
2e1b0 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
2e1c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e1d0 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
2e1e0 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
2e1f0 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
2e200 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
2e210 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
2e220 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
2e230 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
2e240 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
2e250 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
2e260 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
2e270 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
2e280 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
2e290 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
2e2a0 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
2e2b0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
2e2c0 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
2e2d0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2e2e0 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
2e2f0 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
2e300 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
2e310 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
2e320 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
2e330 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
2e340 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
2e350 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2e360 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
2e370 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
2e380 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
2e390 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  * occurs while l
2e3a0 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
2e3b0 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
2e3c0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
2e3d0 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c  file or .** roll
2e3e0 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
2e3f0 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20  al file, the IO 
2e400 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2e410 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2e420 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
2e430 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
2e440 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2e450 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2e460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2e470 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2e480 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2e490 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
2e4a0 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f  rom b-tree and o
2e4b0 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61  nly when there a
2e4c0 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74  re no.  ** outst
2e4d0 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68  anding pages. Th
2e4e0 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  is implies that 
2e4f0 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  the pager state 
2e500 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20  should either.  
2e510 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45  ** be OPEN or RE
2e520 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20  ADER. READER is 
2e530 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
2e540 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72   the pager is or
2e550 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78   was in .  ** ex
2e560 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
2e570 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
2e580 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
2e590 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2e5a0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
2e5b0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
2e5c0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2e5d0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
2e5e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2e5f0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
2e600 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2e610 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
2e620 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d  .  if( NEVER(MEM
2e630 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  DB && pPager->er
2e640 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e  rCode) ){ return
2e650 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e660 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65  ; }..  if( !page
2e670 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2e680 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
2e690 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e==PAGER_OPEN ){
2e6a0 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75  .    int bHotJou
2e6b0 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  rnal = 1;       
2e6c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2e6d0 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74  ere exists a hot
2e6e0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f   journal-file */
2e6f0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ..    assert( !M
2e700 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
2e710 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  rt( pPager->noRe
2e720 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50 61  adlock==0 || pPa
2e730 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  ger->readOnly );
2e740 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
2e750 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20  ->noReadlock==0 
2e760 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2e770 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
2e780 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
2e790 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2e7a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e7b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2e7c0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
2e7d0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
2e7e0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
2e7f0 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
2e800 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2e810 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2e820 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
2e830 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
2e840 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2e850 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
2e860 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2e870 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
2e880 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
2e890 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2e8a0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
2e8b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
2e8c0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
2e8d0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
2e8e0 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
2e8f0 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
2e900 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
2e910 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2e920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e930 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
2e940 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
2e950 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
2e960 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
2e970 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
2e980 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
2e990 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
2e9a0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
2e9b0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
2e9c0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
2e9d0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
2e9e0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
2e9f0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
2ea00 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
2ea10 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
2ea20 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
2ea30 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
2ea40 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
2ea50 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2ea60 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
2ea70 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
2ea80 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
2ea90 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
2eaa0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
2eab0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
2eac0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
2ead0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
2eae0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
2eaf0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
2eb00 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
2eb10 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2eb20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
2eb30 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
2eb40 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
2eb50 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
2eb60 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
2eb70 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
2eb80 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
2eb90 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
2eba0 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
2ebb0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
2ebc0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
2ebd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ebe0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
2ebf0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
2ec00 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
2ec10 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
2ec20 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
2ec30 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
2ec40 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
2ec50 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
2ec60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2ec70 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
2ec80 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2ec90 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
2eca0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
2ecb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ecc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ecd0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2ece0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
2ecf0 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
2ed00 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
2ed10 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
2ed20 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
2ed30 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
2ed40 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
2ed50 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
2ed60 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
2ed70 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
2ed80 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
2ed90 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
2eda0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2edb0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
2edc0 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
2edd0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
2ede0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
2edf0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
2ee00 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
2ee10 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
2ee20 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
2ee30 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
2ee40 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
2ee50 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
2ee60 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
2ee70 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
2ee80 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
2ee90 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
2eea0 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
2eeb0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
2eec0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
2eed0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
2eee0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
2eef0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2ef00 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
2ef10 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
2ef20 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
2ef30 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
2ef40 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
2ef50 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
2ef60 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
2ef70 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
2ef80 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
2ef90 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
2efa0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
2efb0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
2efc0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
2efd0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
2efe0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
2eff0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
2f000 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2f010 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2f020 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
2f030 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
2f040 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
2f050 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
2f060 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
2f070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f080 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
2f090 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
2f0a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f0b0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
2f0c0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
2f0d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2f0e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2f0f0 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
2f100 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2f110 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
2f120 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
2f130 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2f140 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
2f150 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   = .#if SQLITE_E
2f160 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
2f170 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  CTION.          
2f180 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
2f190 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2f1a0 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
2f1b0 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
2f1c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2f1d0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2f1e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2f1f0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
2f200 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2f210 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2f220 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2f230 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2f240 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2f250 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
2f260 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
2f270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2f280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2f290 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f2a0 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
2f2b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f2c0 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
2f2d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
2f2e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2f2f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
2f300 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
2f310 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
2f320 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
2f330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2f340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f350 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
2f360 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
2f370 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
2f380 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
2f390 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
2f3a0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
2f3b0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
2f3c0 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
2f3d0 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
2f3e0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
2f3f0 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
2f400 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
2f410 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
2f420 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
2f430 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
2f440 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
2f450 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
2f460 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
2f470 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
2f480 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
2f490 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
2f4a0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
2f4b0 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
2f4c0 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
2f4d0 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
2f4e0 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
2f4f0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
2f500 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
2f510 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
2f520 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
2f530 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2f540 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
2f550 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2f560 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
2f570 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
2f580 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2f590 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2f5a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f5b0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2f5c0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
2f5d0 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 1);.         
2f5e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2f5f0 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
2f600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2f610 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
2f620 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
2f630 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
2f640 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2f650 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2f660 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2f670 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f680 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2f690 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
2f6a0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
2f6b0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
2f6c0 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
2f6d0 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
2f6e0 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
2f6f0 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
2f700 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2f710 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
2f720 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
2f730 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
2f740 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
2f750 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
2f760 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2f770 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
2f780 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
2f790 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
2f7a0 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
2f7b0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
2f7c0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
2f7d0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
2f7e0 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
2f7f0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
2f800 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
2f810 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
2f820 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
2f830 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
2f840 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
2f850 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
2f860 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
2f870 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
2f880 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
2f890 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
2f8a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
2f8b0 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
2f8c0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
2f8d0 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
2f8e0 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
2f8f0 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
2f900 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
2f910 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
2f920 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
2f930 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
2f940 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
2f950 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
2f960 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
2f970 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
2f980 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
2f990 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
2f9a0 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
2f9b0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
2f9c0 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
2f9d0 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
2f9e0 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
2f9f0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
2fa00 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
2fa10 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
2fa20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
2fa30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
2fa40 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
2fa50 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
2fa60 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2fa70 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
2fa80 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
2fa90 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
2faa0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2fab0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
2fac0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
2fad0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
2fae0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
2faf0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
2fb00 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
2fb10 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
2fb20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
2fb30 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
2fb40 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
2fb50 6d 70 46 69 6c 65 20 0a 20 20 20 20 20 26 26 20  mpFile .     && 
2fb60 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
2fb70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
2fb80 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
2fb90 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 29 20 0a  r->pPCache)>0) .
2fba0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2fbb0 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
2fbc0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
2fbd0 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61  quired on the da
2fbe0 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20  tabase file.    
2fbf0 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
2fc00 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73  re already pages
2fc10 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66   in the cache (f
2fc20 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20  rom a previous. 
2fc30 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
2fc40 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
2fc50 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
2fc60 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
2fc70 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62  e.      ** has b
2fc80 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
2fc90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
2fca0 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
2fcb0 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  h the.      ** c
2fcc0 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ache..      **. 
2fcd0 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
2fce0 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65   changes is dete
2fcf0 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
2fd00 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
2fd10 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
2fd20 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
2fd30 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
2fd40 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
2fd50 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
2fd60 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
2fd70 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
2fd80 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
2fd90 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
2fda0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
2fdb0 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
2fdc0 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
2fdd0 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
2fde0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
2fdf0 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
2fe00 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
2fe10 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
2fe20 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
2fe30 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
2fe40 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
2fe50 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
2fe60 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
2fe70 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
2fe80 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
2fe90 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
2fea0 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
2feb0 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
2fec0 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2fed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
2fee0 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
2fef0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
2ff00 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
2ff10 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2ff20 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2ff30 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2ff40 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b  c ) goto failed;
2ff50 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
2ff60 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
2ff70 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
2ff80 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
2ff90 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
2ffa0 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
2ffb0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
2ffc0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
2ffd0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
2ffe0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
2fff0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
30000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30010 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
30020 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
30030 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
30040 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
30050 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
30060 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
30070 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
30080 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
30090 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
300a0 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
300b0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
300c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
300d0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
300e0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
300f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
30100 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65  re is a WAL file
30110 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
30120 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64  tem, open this d
30130 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20  atabase in WAL. 
30140 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65     ** mode. Othe
30150 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  rwise, the follo
30160 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  wing function ca
30170 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
30180 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
30190 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
301a0 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69  sent(pPager);.#i
301b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
301c0 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74  T_WAL.    assert
301d0 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  ( pPager->pWal==
301e0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
301f0 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  OK );.#endif.  }
30200 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
30210 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
30220 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
30230 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
30240 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
30250 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
30260 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
30270 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
30280 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
30290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
302a0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
302b0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
302c0 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
302d0 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64  e);.  }.. failed
302e0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
302f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
30300 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
30310 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
30320 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
30330 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30340 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30350 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30360 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
30370 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
30380 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30390 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
303a0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
303b0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
303c0 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
303d0 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
303e0 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
303f0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
30400 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
30410 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
30420 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
30430 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
30440 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
30450 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
30460 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
30470 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
30480 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
30490 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
304a0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
304b0 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
304c0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
304d0 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
304e0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28  pPager){.  if( (
304f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
30500 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
30510 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20  Cache)==0) ){.  
30520 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
30530 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
30540 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
30550 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
30560 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
30570 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
30580 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
30590 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
305a0 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
305b0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
305c0 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
305d0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
305e0 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
305f0 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
30600 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
30610 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
30620 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
30630 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
30640 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
30650 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
30660 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
30670 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
30680 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
30690 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
306a0 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
306b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
306c0 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
306d0 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
306e0 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
306f0 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
30700 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
30710 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
30720 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
30730 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
30740 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
30750 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
30760 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
30770 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
30780 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
30790 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
307a0 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
307b0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
307c0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
307d0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
307e0 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
307f0 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
30800 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
30810 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
30820 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
30830 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
30840 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
30850 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
30860 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
30870 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
30880 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
30890 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
308a0 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
308b0 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
308c0 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
308d0 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
308e0 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
308f0 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
30900 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
30910 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
30920 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
30930 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
30940 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
30950 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
30960 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
30970 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
30980 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
30990 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
309a0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
309b0 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
309c0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
309d0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
309e0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
309f0 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
30a00 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72  urs in two seper
30a10 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  ate scenarios:.*
30a20 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
30a30 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
30a40 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
30a50 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
30a60 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
30a70 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
30a80 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
30a90 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
30aa0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
30ab0 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
30ac0 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
30ad0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
30ae0 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
30af0 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
30b00 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
30b10 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
30b20 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
30b30 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
30b40 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
30b50 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
30b60 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
30b70 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
30b80 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
30b90 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
30ba0 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
30bb0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
30bc0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
30bd0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
30be0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
30bf0 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
30c00 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
30c10 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
30c20 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
30c30 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
30c40 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
30c50 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
30c60 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
30c70 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
30c80 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
30c90 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
30ca0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
30cb0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
30cc0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
30cd0 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
30ce0 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
30cf0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
30d00 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
30d10 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
30d20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
30d30 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
30d40 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
30d50 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
30d60 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
30d70 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
30d80 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
30d90 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
30da0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
30db0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
30dc0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
30dd0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
30de0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
30df0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
30e00 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
30e10 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
30e20 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
30e30 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
30e40 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
30e50 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
30e60 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
30e70 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
30e80 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
30e90 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
30ea0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
30eb0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
30ec0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
30ed0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
30ee0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
30ef0 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
30f00 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
30f10 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
30f20 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
30f30 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
30f40 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
30f50 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
30f60 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
30f70 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
30f80 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
30f90 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
30fa0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
30fb0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
30fc0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
30fd0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
30fe0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
30ff0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
31000 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
31010 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
31020 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
31030 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
31040 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
31050 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
31060 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
31070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31080 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
31090 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
310a0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
310b0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
310c0 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
310d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
310e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
310f0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
31100 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
31110 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31120 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
31130 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
31140 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
31150 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
31160 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
31170 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
31180 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
31190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
311a0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
311b0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
311c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
311d0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
311e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
311f0 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
31200 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
31210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31220 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
31230 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
31240 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
31250 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
31260 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
31270 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
31280 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
31290 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
312a0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
312b0 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
312c0 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
312d0 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
312e0 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
312f0 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
31300 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
31310 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
31320 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
31330 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
31340 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
31350 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
31360 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
31370 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
31380 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
31390 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
313a0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
313b0 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
313c0 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
313d0 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
313e0 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
313f0 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
31400 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
31410 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
31420 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
31430 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
31440 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
31450 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
31460 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
31470 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
31480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31490 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K;..  }else{.   
314a0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
314b0 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
314c0 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
314d0 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
314e0 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
314f0 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20  ialized.  */..  
31500 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
31510 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
31520 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a   pPg = *ppPage;.
31530 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
31540 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
31550 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
31560 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
31570 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
31580 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
31590 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
315a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
315b0 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
315c0 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
315d0 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
315e0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
315f0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
31600 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
31610 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
31620 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31630 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31640 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
31650 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
31660 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   }..    if( MEMD
31670 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  B || pPager->dbS
31680 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f  ize<pgno || noCo
31690 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e  ntent || !isOpen
316a0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
316b0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
316c0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
316d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
316e0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
316f0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
31700 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
31710 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
31720 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
31730 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
31740 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
31750 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
31760 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
31770 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
31780 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
31790 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
317a0 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
317b0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
317c0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
317d0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
317e0 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
317f0 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
31800 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
31810 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
31820 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
31830 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
31840 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
31850 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
31860 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
31870 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
31880 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
31890 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
318a0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
318b0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
318c0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
318d0 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
318e0 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
318f0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
31900 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
31910 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
31920 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
31930 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
31940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31950 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
31960 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
31970 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
31980 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
31990 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
319a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
319b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
319c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
319d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
319e0 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
319f0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
31a00 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
31a10 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
31a20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
31a30 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
31a40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31a50 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
31a60 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
31a70 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
31a80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31aa0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
31ab0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
31ac0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
31ad0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
31ae0 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
31af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31b00 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
31b10 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
31b20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
31b30 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
31b40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
31b50 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
31b60 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
31b70 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
31b80 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
31b90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31ba0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
31bb0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
31bc0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
31bd0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
31be0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
31bf0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
31c00 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
31c10 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
31c20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
31c30 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
31c40 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
31c50 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
31c60 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
31c70 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
31c80 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
31c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
31ca0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
31cb0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
31cc0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
31cd0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
31ce0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
31cf0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
31d00 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
31d10 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
31d20 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
31d30 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
31d40 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
31d50 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
31d60 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
31d70 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
31d80 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
31d90 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
31da0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
31db0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
31dc0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
31dd0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
31de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31df0 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
31e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31e10 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
31e20 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
31e30 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
31e40 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c  R_ERROR );.  sql
31e50 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
31e60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
31e70 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
31e80 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
31e90 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
31ea0 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
31eb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
31ec0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
31ed0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
31ee0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
31ef0 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
31f00 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
31f10 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
31f20 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
31f30 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
31f40 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
31f50 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
31f60 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
31f70 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
31f80 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
31f90 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
31fa0 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
31fb0 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
31fc0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
31fd0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
31fe0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
31ff0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
32000 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
32010 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
32020 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
32030 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
32040 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
32050 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
32060 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
32070 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
32080 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
32090 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
320a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
320b0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
320c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
320d0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
320e0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
320f0 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
32100 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
32110 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
32120 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
32130 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
32140 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
32150 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
32160 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
32170 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
32180 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
32190 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
321a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
321b0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
321c0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
321d0 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
321e0 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
321f0 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
32200 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
32210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
32220 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
32230 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
32240 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
32250 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
32260 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
32270 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
32280 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32290 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
322a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
322b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
322c0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
322d0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
322e0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
322f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
32300 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
32310 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
32320 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
32330 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
32340 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
32350 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
32360 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
32370 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
32380 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
32390 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
323a0 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
323b0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
323c0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
323d0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
323e0 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
323f0 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
32400 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
32410 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
32420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
32430 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
32440 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
32450 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
32460 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
32470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32480 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
32490 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
324a0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
324b0 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
324c0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
324d0 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
324e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
324f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32500 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
32510 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
32520 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
32530 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
32540 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
32550 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
32560 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
32570 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
32580 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
32590 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
325a0 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
325b0 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
325c0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
325d0 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
325e0 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
325f0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
32600 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
32610 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
32620 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
32630 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66  ->errCode;..  if
32640 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
32650 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
32660 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
32670 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32680 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67  _OFF ){.    pPag
32690 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
326a0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
326b0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
326c0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
326d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
326e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
326f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
32700 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
32710 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
32720 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
32730 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
32740 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  n. */.    if( !i
32750 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32760 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
32770 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
32780 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32790 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
327a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
327b0 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
327c0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
327d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
327e0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
327f0 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
32800 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
32810 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
32820 61 6c 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20 53  al file */.#if S
32830 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
32840 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
32850 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
32860 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
32870 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
32880 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
32890 66 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  f.          SQLI
328a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
328b0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
328c0 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
328d0 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
328e0 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  e ? .           
328f0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
32900 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
32910 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
32920 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20  RNAL):.         
32930 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
32940 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
32950 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66          );.  #if
32960 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
32970 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
32980 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32990 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
329a0 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
329b0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
329c0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
329d0 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
329e0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
329f0 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73         );.  #els
32a00 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  e.        rc = s
32a10 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
32a20 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
32a30 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
32a40 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23  , flags, 0);.  #
32a50 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
32a60 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
32a70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
32a80 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32a90 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
32aa0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
32ab0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
32ac0 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
32ad0 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
32ae0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
32af0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
32b00 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
32b10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
32b30 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
32b40 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
32b50 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
32b60 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
32b70 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
32b80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
32b90 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
32ba0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
32bb0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
32bc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
32bd0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
32be0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
32bf0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
32c00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
32c10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32c20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
32c30 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
32c40 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
32c50 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
32c60 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
32c70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32c80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32c90 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
32ca0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
32cb0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
32cc0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
32cd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
32ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
32cf0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
32d00 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
32d10 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
32d20 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
32d30 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
32d40 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
32d50 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
32d60 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
32d70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
32d80 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
32d90 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
32da0 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
32db0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
32dc0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32dd0 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
32de0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
32df0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
32e00 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
32e10 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
32e20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
32e30 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
32e40 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
32e50 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
32e60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
32e70 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
32e80 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
32e90 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
32ea0 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
32eb0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
32ec0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
32ed0 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
32ee0 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
32ef0 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
32f00 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
32f10 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
32f20 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
32f30 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
32f40 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
32f50 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
32f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
32f70 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
32f80 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
32f90 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
32fa0 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
32fb0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
32fc0 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
32fd0 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
32fe0 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
32ff0 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
33000 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
33010 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
33020 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
33030 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
33040 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
33050 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
33060 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
33070 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
33080 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
33090 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
330a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
330b0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
330c0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
330d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
330e0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
330f0 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
33100 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
33110 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
33120 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
33130 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
33140 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pPag
33150 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33160 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20  R_READER) ){.   
33170 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33180 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
33190 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
331a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
331b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
331c0 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
331d0 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
331e0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
331f0 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
33200 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
33210 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
33220 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
33230 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
33240 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
33250 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
33260 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
33270 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
33280 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
33290 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
332a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
332b0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
332c0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
332d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
332e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
332f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
33300 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
33310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
33320 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
33330 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
33340 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33350 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
33360 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
33370 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
33380 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
33390 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
333a0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
333b0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
333c0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
333d0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
333e0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
333f0 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
33400 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
33410 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
33420 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
33430 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
33440 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
33450 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
33460 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
33470 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33480 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
33490 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
334a0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
334b0 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
334c0 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61       /* Obtain a
334d0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
334e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
334f0 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
33500 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
33510 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
33520 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
33530 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
33540 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
33550 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  k. The.      ** 
33560 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
33570 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
33580 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
33590 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
335a0 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c  E.      ** lock,
335b0 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62   but not when ob
335c0 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45  taining the RESE
335d0 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  RVED lock..     
335e0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
335f0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
33600 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
33610 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
33620 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
33630 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
33640 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
33650 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
33660 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
33670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
33680 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33690 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
336a0 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54  * Change to WRIT
336b0 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e  ER_LOCKED state.
336c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
336d0 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73  ** WAL mode sets
336e0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
336f0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
33700 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44  CKED or CACHEMOD
33710 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69  .      ** when i
33720 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72  t has an open tr
33730 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e  ansaction, but n
33740 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72  ever to DBMOD or
33750 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20   FINISHED..     
33760 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
33770 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61  use in those sta
33780 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
33790 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f  roll back savepo
337a0 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
337b0 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63  ansactions may c
337c0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
337d0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e  e sub-journal in
337e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
337f0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
33800 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74  s well as into t
33810 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57  he page cache. W
33820 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e  hich would be in
33830 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20  correct in .    
33840 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20    ** WAL mode.. 
33850 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
33860 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
33870 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
33880 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ED;.      pPager
33890 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
338a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
338b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
338c0 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ileSize = pPager
338d0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
338e0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
338f0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
33900 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
33910 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
33920 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  0;.    }..    as
33930 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
33940 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
33950 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
33960 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  DER );.    asser
33970 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
33980 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
33990 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
339a0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61  _LOCKED );.    a
339b0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
339c0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
339d0 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  ) );.  }..  PAGE
339e0 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
339f0 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
33a00 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
33a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33a20 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67  *.** Mark a sing
33a30 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20  le data page as 
33a40 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70  writeable. The p
33a50 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
33a60 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  nto the .** main
33a70 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
33a80 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69  journal as requi
33a90 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  red. If the page
33aa0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
33ab0 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a  .** one of the j
33ac0 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72  ournals, the cor
33ad0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
33ae0 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a  s set in the .**
33af0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
33b00 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65  l bitvec and the
33b10 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
33b20 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
33b30 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f  vecs.** of any o
33b40 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61  pen savepoints a
33b50 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
33b60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
33b70 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
33b80 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
33b90 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
33ba0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
33bb0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
33bc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33bd0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
33be0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
33bf0 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
33c00 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
33c10 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a  on has already .
33c20 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65    ** been starte
33c30 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d. The journal f
33c40 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ile may or may n
33c50 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68  ot be open at th
33c60 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49  is point..  ** I
33c70 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  t is never calle
33c80 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  d in the ERROR s
33c90 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tate..  */.  ass
33ca0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33cb0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
33cc0 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
33cd0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
33ce0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
33cf0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
33d00 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
33d10 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
33d20 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
33d30 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
33d40 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
33d50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  );..  /* If an e
33d60 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
33d70 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65  eviously detecte
33d80 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61  d, report the sa
33d90 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67  me error.  ** ag
33da0 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ain. This should
33db0 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74   not happen, but
33dc0 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69   the check provi
33dd0 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20  des robustness. 
33de0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
33df0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
33e00 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  )  return pPager
33e10 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
33e20 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   Higher-level ro
33e30 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c  utines never cal
33e40 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
33e50 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  if database is n
33e60 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65  ot.  ** writable
33e70 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79  .  But check any
33e80 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f  way, just for ro
33e90 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
33ea0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
33eb0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74  >readOnly) ) ret
33ec0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
33ed0 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
33ee0 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  Pg);..  /* The j
33ef0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
33f00 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20  s to be opened. 
33f10 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
33f20 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61  tines have alrea
33f30 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  dy.  ** obtained
33f40 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c   the necessary l
33f50 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68  ocks to begin th
33f60 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
33f70 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a  ion, but the.  *
33f80 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
33f90 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74  al might not yet
33fa0 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69   be open. Open i
33fb0 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73  t now if this is
33fc0 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a   the case..  **.
33fd0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e    ** This is don
33fe0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
33ff0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
34000 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65  keDirty() on the
34010 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68   page. .  ** Oth
34020 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65  erwise, if it we
34030 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61  re done after ca
34040 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
34050 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20  cheMakeDirty(), 
34060 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  then.  ** an err
34070 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61  or might occur a
34080 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75  nd the pager wou
34090 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49  ld end up in WRI
340a0 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
340b0 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73  .  ** with pages
340c0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
340d0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20   in the cache.. 
340e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
340f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
34100 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
34110 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
34120 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
34130 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
34140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
34150 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
34160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
34170 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
34180 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
34190 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
341a0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
341b0 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ger) );..  /* Ma
341c0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
341d0 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
341e0 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
341f0 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
34200 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
34210 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
34220 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
34230 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
34240 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
34250 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a  );.  if( pageInJ
34260 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
34270 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
34280 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73  (pPg) ){.    ass
34290 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
342a0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  l(pPager) );.  }
342b0 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
342c0 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
342d0 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
342e0 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
342f0 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
34300 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
34310 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
34320 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
34330 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
34340 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
34350 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
34360 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
34370 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
34380 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
34390 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75    if( !pageInJou
343a0 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70 61  rnal(pPg) && !pa
343b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
343c0 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
343d0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
343e0 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
343f0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
34400 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
34410 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70  Size && isOpen(p
34420 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
34430 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
34440 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
34450 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20  pData2;.        
34460 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65  i64 iOff = pPage
34470 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
34480 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
34490 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
344a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
344b0 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
344c0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
344d0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
344e0 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
344f0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
34500 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
34510 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
34520 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
34530 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
34540 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
34550 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
34560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
34570 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c  ger->journalHdr<
34580 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
34590 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43  Off );.        C
345a0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
345b0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
345c0 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
345d0 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
345e0 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d  .        cksum =
345f0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
34600 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
34610 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
34620 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
34630 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
34640 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72  ccurs while jour
34650 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  nalling the.    
34660 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
34670 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
34680 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
34690 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
346a0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  age..        ** 
346b0 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
346c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
346d0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
346e0 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20  the logic in.   
346f0 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b       ** playback
34700 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
34710 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
34720 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
34730 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20   restored.      
34740 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
34750 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
34760 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
34770 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
34780 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
34790 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
347a0 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20  may follow..    
347b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
347c0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
347d0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20  DR_NEED_SYNC;.. 
347e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
347f0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
34800 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e  jfd, iOff, pPg->
34810 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
34820 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34830 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
34840 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34850 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
34860 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
34870 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
34880 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20   iOff+4);.      
34890 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
348a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
348b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
348c0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
348d0 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67  ->jfd, iOff+pPag
348e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
348f0 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
34900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34910 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
34920 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
34930 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
34940 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
34950 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
34960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
34970 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
34980 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34990 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
349a0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
349b0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
349c0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
349d0 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
349e0 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
349f0 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
34a00 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
34a10 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
34a20 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
34a30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
34a40 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
34a50 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
34a60 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
34a70 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
34a80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
34a90 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50  nalOff += 8 + pP
34aa0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
34ab0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
34ac0 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
34ad0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34ae0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
34af0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34b00 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
34b10 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
34b20 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
34b30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
34b40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34b50 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  M );.        ass
34b60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34b70 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
34b80 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34b90 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
34ba0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
34bb0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
34bc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34bd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34be0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34c00 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  M );.          r
34c10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34c20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
34c30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
34c40 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
34c50 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
34c60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
34c70 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
34c80 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
34c90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
34ca0 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
34cb0 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
34cc0 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
34cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
34ce0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
34cf0 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
34d00 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
34d10 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
34d20 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
34d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
34d40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
34d50 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
34d60 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
34d70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
34d80 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
34d90 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
34da0 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
34db0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
34dc0 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
34dd0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34de0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
34df0 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
34e00 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
34e10 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
34e20 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
34e30 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
34e40 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
34e50 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
34e60 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
34e70 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
34e80 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
34e90 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
34ea0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
34eb0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
34ec0 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
34ed0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
34ee0 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
34ef0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
34f00 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
34f10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
34f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
34f30 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
34f40 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
34f50 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
34f60 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
34f70 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
34f80 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
34f90 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
34fa0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
34fb0 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
34fc0 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
34fd0 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
34fe0 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
34ff0 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
35000 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
35010 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
35020 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
35030 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
35040 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
35050 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
35060 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
35070 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
35080 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
35090 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
350a0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
350b0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
350c0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
350d0 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
350e0 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
350f0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
35100 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
35110 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
35120 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
35130 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
35140 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
35150 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
35160 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
35170 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
35180 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
35190 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
351a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
351b0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
351c0 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
351d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
351e0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
351f0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
35200 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
35210 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
35220 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
35230 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
35240 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
35250 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ze);..  assert( 
35260 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
35270 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
35280 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
35290 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
352a0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
352b0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
352c0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
352d0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e  ger) );..  if( n
352e0 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
352f0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
35300 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
35310 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
35320 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
35330 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
35340 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
35350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
35360 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
35370 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
35380 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
35390 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b    int nPage = 0;
353a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
353b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
353c0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
353d0 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
353e0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
353f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
35400 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
35410 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
35420 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
35430 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20  rue if any page 
35440 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  has PGHDR_NEED_S
35450 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  YNC */..    /* S
35460 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
35470 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e  Spill flag to 1.
35480 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
35490 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
354a0 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  .    ** a journa
354b0 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  l header to be w
354c0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
354d0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
354e0 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69  ed by.    ** thi
354f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
35500 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
35510 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
35520 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
35530 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29  otSyncSpill==0 )
35540 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
35550 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a  NotSyncSpill++;.
35560 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
35570 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
35580 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
35590 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
355a0 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
355b0 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
355c0 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
355d0 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
355e0 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
355f0 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
35600 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
35610 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
35620 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
35630 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
35640 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
35650 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
35660 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e  ;..    nPageCoun
35670 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  t = pPager->dbSi
35680 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  ze;.    if( pPg-
35690 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
356a0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
356b0 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
356c0 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
356d0 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
356e0 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
356f0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
35700 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
35710 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
35720 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
35730 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
35740 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
35750 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
35760 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
35770 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
35780 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
35790 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
357a0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
357b0 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
357c0 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
357d0 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
357e0 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
357f0 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
35800 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
35810 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
35820 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
35830 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
35840 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
35850 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
35860 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
35870 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35880 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
35890 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
358a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
358b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
358c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
358d0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
358e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
358f0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
35900 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
35910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35920 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
35930 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
35940 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35950 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
35960 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
35970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35980 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
35990 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
359a0 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
359b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
359c0 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
359d0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
359e0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
359f0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
35a00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35a10 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
35a20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35a30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
35a40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
35a50 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
35a60 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
35a70 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
35a80 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
35a90 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
35aa0 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
35ab0 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
35ac0 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
35ad0 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
35ae0 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
35af0 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
35b00 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
35b10 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
35b20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
35b30 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
35b40 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
35b50 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
35b60 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
35b70 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
35b80 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
35b90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35ba0 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79  ITE_OK && needSy
35bb0 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
35bc0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
35bd0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
35be0 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  <nPage; ii++){. 
35bf0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
35c00 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
35c10 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
35c20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
35c30 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
35c40 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20     pPage->flags 
35c50 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
35c60 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  NC;.          sq
35c70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35c80 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35c90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
35ca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35cb0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
35cc0 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ill==1 );.    pP
35cd0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
35ce0 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  pill--;.  }else{
35cf0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
35d00 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
35d10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
35d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
35d30 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
35d40 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
35d50 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
35d60 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
35d70 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
35d80 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
35d90 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
35da0 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
35db0 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
35dc0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
35dd0 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
35de0 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
35df0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
35e00 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
35e10 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
35e20 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
35e30 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  RTY;.}.#endif../
35e40 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
35e50 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
35e60 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
35e70 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
35e80 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
35e90 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
35ea0 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
35eb0 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
35ec0 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
35ed0 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
35ee0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
35ef0 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
35f00 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
35f10 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68  en.** the page h
35f20 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73  as been added as
35f30 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66   a leaf of the f
35f40 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69  reelist and so i
35f50 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f  ts.** content no
35f60 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e   longer matters.
35f70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
35f80 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
35f90 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
35fa0 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
35fb0 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
35fc0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
35fd0 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20   is unused. The 
35fe0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
35ff0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
36000 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
36010 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
36020 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
36030 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
36040 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
36050 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20  n can quadruple 
36060 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
36070 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70  ge .** DELETE op
36080 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69  erations..*/.voi
36090 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
360a0 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70  ntWrite(PgHdr *p
360b0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
360c0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
360d0 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e  er;.  if( (pPg->
360e0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
360f0 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  Y) && pPager->nS
36100 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20  avepoint==0 ){. 
36110 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
36120 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
36130 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
36140 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
36150 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49  pPager)));.    I
36160 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
36170 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
36180 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
36190 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
361a0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
361b0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
361c0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
361d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
361e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
361f0 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
36200 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
36210 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a  database file .*
36220 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  * change-counter
36230 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d  , stored as a 4-
36240 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
36250 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67  integer starting
36260 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66   at .** byte off
36270 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61  set 24 of the pa
36280 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65 20 73  ger file.  The s
36290 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67 65 20  econdary change 
362a0 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a 20 39 32  counter at.** 92
362b0 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64   is also updated
362c0 2c 20 61 73 20 69 73 20 74 68 65 20 53 51 4c 69  , as is the SQLi
362d0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
362e0 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
362f0 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69 73 20 6f  **.** But this o
36300 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
36310 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  he pPager->chang
36320 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
36330 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 54 6f 20  is false..** To 
36340 61 76 6f 69 64 20 65 78 63 65 73 73 20 63 68 75  avoid excess chu
36350 72 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 31 2c  rning of page 1,
36360 20 74 68 65 20 75 70 64 61 74 65 20 6f 6e 6c 79   the update only
36370 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 0a 2a   happens once..*
36380 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70  * See also the p
36390 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
363a0 65 63 6f 75 6e 74 65 72 28 29 20 72 6f 75 74 69  ecounter() routi
363b0 6e 65 20 74 68 61 74 20 64 6f 65 73 20 61 6e 20  ne that does an 
363c0 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61  .** unconditiona
363d0 6c 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  l update of the 
363e0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 73 2e  change counters.
363f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
36400 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20  DirectMode flag 
36410 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
36420 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61  is is done by ca
36430 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65  lling .** sqlite
36440 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
36450 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f   page 1, then mo
36460 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
36470 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  ents of the.** p
36480 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69  age data. In thi
36490 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20  s case the file 
364a0 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20  will be updated 
364b0 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
364c0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
364d0 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
364e0 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74  .** The isDirect
364f0 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e  Mode flag may on
36500 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ly be non-zero i
36510 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  f the library wa
36520 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69  s compiled.** wi
36530 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  th the SQLITE_EN
36540 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
36550 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  E macro defined.
36560 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
36570 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73  * if isDirect is
36580 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
36590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
365a0 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72  e is updated dir
365b0 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74  ectly.** by writ
365c0 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76  ing an updated v
365d0 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
365e0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
365f0 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
36600 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  OsWrite() functi
36610 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
36620 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
36630 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
36640 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
36650 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69  DirectMode){.  i
36660 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36670 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
36680 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36690 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
366a0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
366b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
366c0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
366d0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
366e0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
366f0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
36700 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20   /* Declare and 
36710 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74  initialize const
36720 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44  ant integer 'isD
36730 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20  irect'. If the. 
36740 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65   ** atomic-write
36750 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
36760 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73   enabled in this
36770 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44   build, then isD
36780 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e  irect.  ** is in
36790 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
367a0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
367b0 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
367c0 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  e parameter.  **
367d0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
367e0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  n. Otherwise, it
367f0 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74   is always set t
36800 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  o zero..  **.  *
36810 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
36820 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63  at if the atomic
36830 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
36840 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ion is not.  ** 
36850 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
36860 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d  le time, the com
36870 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74  piler can omit t
36880 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a  he tests of.  **
36890 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f   'isDirect' belo
368a0 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  w, as well as th
368b0 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64  e block enclosed
368c0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66   in the.  ** "if
368d0 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f  ( isDirect )" co
368e0 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ndition..  */.#i
368f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
36900 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
36910 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
36920 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74  _MODE 0.  assert
36930 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d  ( isDirectMode==
36940 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
36950 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74  RAMETER(isDirect
36960 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64  Mode);.#else.# d
36970 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
36980 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23  E isDirectMode.#
36990 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50  endif..  if( !pP
369a0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
369b0 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d  tDone && pPager-
369c0 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
369d0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20   PgHdr *pPgHdr; 
369e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
369f0 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70  * Reference to p
36a00 61 67 65 20 31 20 2a 2f 0a 0a 20 20 20 20 61 73  age 1 */..    as
36a10 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
36a20 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65  empFile && isOpe
36a30 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
36a40 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  ..    /* Open pa
36a50 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
36a60 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
36a70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36a80 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
36a90 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
36aa0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64     assert( pPgHd
36ab0 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  r==0 || rc==SQLI
36ac0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
36ad0 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73   If page one was
36ae0 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73   fetched success
36af0 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20  fully, and this 
36b00 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  function is not.
36b10 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67      ** operating
36b20 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c   in direct-mode,
36b30 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69   make page 1 wri
36b40 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74  table.  When not
36b50 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65   in .    ** dire
36b60 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20  ct mode, page 1 
36b70 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69  is always held i
36b80 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63  n cache and henc
36b90 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29  e the PagerGet()
36ba0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73  .    ** above is
36bb0 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66   always successf
36bc0 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41  ul - hence the A
36bd0 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c  LWAYS on rc==SQL
36be0 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20  ITE_OK..    */. 
36bf0 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d     if( !DIRECT_M
36c00 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63  ODE && ALWAYS(rc
36c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  ==SQLITE_OK) ){.
36c20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36c30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
36c40 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hdr);.    }..   
36c50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36c60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  OK ){.      /* A
36c70 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 75  ctually do the u
36c80 70 64 61 74 65 20 6f 66 20 74 68 65 20 63 68 61  pdate of the cha
36c90 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge counter */. 
36ca0 20 20 20 20 20 70 61 67 65 72 5f 77 72 69 74 65       pager_write
36cb0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
36cc0 50 67 48 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f  PgHdr);..      /
36cd0 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
36ce0 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69  direct mode, wri
36cf0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
36d00 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65  of page 1 to the
36d10 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
36d20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  if( DIRECT_MODE 
36d30 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
36d40 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20   void *zBuf;.   
36d50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
36d60 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
36d70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  0 );.        COD
36d80 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 48  EC2(pPager, pPgH
36d90 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c  dr->pData, 1, 6,
36da0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
36db0 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  , zBuf);.       
36dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36dd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36de0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
36df0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
36e00 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
36e10 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
36e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
36e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
36e50 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
36e60 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
36e70 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
36e80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
36e90 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
36ea0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
36eb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
36ec0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
36ed0 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
36ee0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36ef0 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20  (pPgHdr);.  }.  
36f00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36f10 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
36f20 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 64 69  abase file to di
36f30 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
36f40 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
36f50 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 6f  y databases.** o
36f60 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
36f70 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
36f80 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
36f90 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
36fa0 69 66 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  if called on a p
36fb0 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69  ager for which i
36fc0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68  t is a no-op, th
36fd0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
36fe0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
36ff0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
37000 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
37010 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
37020 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
37030 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
37040 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
37060 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
37070 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
37080 45 4d 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  EMDB );.    rc =
37090 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
370a0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
370b0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
370c0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
370d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
370e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
370f0 4d 44 42 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  MDB );.    sqlit
37100 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
37110 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
37120 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d  TE_FCNTL_SYNC_OM
37130 49 54 54 45 44 2c 20 28 76 6f 69 64 20 2a 29 26  ITTED, (void *)&
37140 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
37150 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
37160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
37170 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
37180 77 68 69 6c 65 20 61 20 77 72 69 74 65 2d 74 72  while a write-tr
37190 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
371a0 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61  ive in.** rollba
371b0 63 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e 65  ck. If the conne
371c0 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20  ction is in WAL 
371d0 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6c 6c 20  mode, this call 
371e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20  is a no-op. .** 
371f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
37200 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f 65  e connection doe
37210 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 61  s not already ha
37220 76 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ve an EXCLUSIVE 
37230 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
37240 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
37250 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
37260 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 2e  e to obtain one.
37270 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  .**.** If the EX
37280 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
37290 61 6c 72 65 61 64 79 20 68 65 6c 64 20 6f 72 20  already held or 
372a0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  the attempt to o
372b0 62 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20 73  btain it is.** s
372c0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 74 68  uccessful, or th
372d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
372e0 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51 4c  in WAL mode, SQL
372f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
37300 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
37310 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
37320 42 55 53 59 20 6f 72 20 61 6e 20 53 51 4c 49 54  BUSY or an SQLIT
37330 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
37340 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
37350 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
37360 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
37370 73 69 76 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a  siveLock(Pager *
37380 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
37390 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
373a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
373b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
373c0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a  RITER_CACHEMOD .
373d0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
373e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
373f0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20  WRITER_DBMOD .  
37400 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37410 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37420 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 29  ITER_LOCKED .  )
37430 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
37440 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
37450 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20  Pager) );.  if( 
37460 30 3d 3d 70 61 67 65 72 55 73 65 57 61 6c 28 70  0==pagerUseWal(p
37470 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63  Pager) ){.    rc
37480 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
37490 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
374a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
374b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
374c0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
374d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
374e0 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
374f0 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
37500 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
37510 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
37520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
37530 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
37540 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
37550 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
37560 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
37570 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
37580 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
37590 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
375a0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
375b0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
375c0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
375d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
375e0 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a  nsures that:.**.
375f0 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
37600 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
37610 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74  counter is updat
37620 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a  ed,.**   * the j
37630 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
37640 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f   (unless the ato
37650 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
37660 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c  zation is used),
37670 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74  .**   * all dirt
37680 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  y pages are writ
37690 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
376a0 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20  ase file, .**   
376b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
376c0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
376d0 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
376e0 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  and.**   * the d
376f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
37700 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ced. .**.** The 
37710 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20  only thing that 
37720 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
37730 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
37740 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  n is to finalize
37750 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72   .** (delete, tr
37760 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
37770 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66  he first part of
37780 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ) the journal fi
37790 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74  le (or .** delet
377a0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
377b0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
377c0 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
377d0 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
377e0 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
377f0 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
37800 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
37810 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
37820 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
37830 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
37840 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
37850 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  the final parame
37860 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69  ter - noSync - i
37870 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
37880 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
37890 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20  tself.** is not 
378a0 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c  synced. The call
378b0 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c  er must call sql
378c0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20  ite3PagerSync() 
378d0 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73  directly to.** s
378e0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
378f0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
37900 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65  ling CommitPhase
37910 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20  Two() to delete 
37920 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
37930 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
37940 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37950 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
37960 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  One(.  Pager *pP
37970 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
37980 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
37990 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
379a0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
379b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
379c0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
379d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
379e0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53  ame */.  int noS
379f0 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
37a00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
37a10 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79   to omit the xSy
37a20 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  nc on the db fil
37a30 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
37a40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
37a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
37a60 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
37a70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37a80 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37a90 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
37aa0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37ab0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37ac0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
37ad0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37ae0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37af0 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c  R_DBMOD.       |
37b00 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
37b10 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
37b20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
37b30 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
37b40 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
37b50 20 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   If a prior erro
37b60 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f  r occurred, repo
37b70 72 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67  rt that error ag
37b80 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ain. */.  if( NE
37b90 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
37ba0 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
37bb0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
37bc0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
37bd0 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
37be0 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
37bf0 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20   nSize=%d\n", . 
37c00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
37c10 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
37c20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
37c30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64  );..  /* If no d
37c40 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
37c50 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20  have been made, 
37c60 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
37c70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
37c80 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54  State<PAGER_WRIT
37c90 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 20 72 65  ER_CACHEMOD ) re
37ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37cb0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
37cc0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
37cd0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
37ce0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
37cf0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
37d00 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20   to, or this.   
37d10 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
37d20 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
37d30 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74  lled, it is most
37d40 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77  ly a no-op.  How
37d50 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a  ever, any.    **
37d60 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72   backup in progr
37d70 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ess needs to be 
37d80 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a  restarted..    *
37d90 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  /.    sqlite3Bac
37da0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
37db0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d  r->pBackup);.  }
37dc0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 61  else{.    if( pa
37dd0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
37de0 29 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  ) ){.      PgHdr
37df0 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
37e00 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
37e10 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
37e20 29 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  );.      PgHdr *
37e30 70 50 61 67 65 4f 6e 65 20 3d 20 30 3b 0a 20 20  pPageOne = 0;.  
37e40 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
37e50 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d   ){.        /* M
37e60 75 73 74 20 68 61 76 65 20 61 74 20 6c 65 61 73  ust have at leas
37e70 74 20 6f 6e 65 20 70 61 67 65 20 66 6f 72 20 74  t one page for t
37e80 68 65 20 57 41 4c 20 63 6f 6d 6d 69 74 20 66 6c  he WAL commit fl
37e90 61 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ag..        ** T
37ea0 69 63 6b 65 74 20 5b 32 64 31 61 35 63 36 37 64  icket [2d1a5c67d
37eb0 66 63 32 33 36 33 65 34 34 66 32 39 64 39 62 62  fc2363e44f29d9bb
37ec0 64 35 37 66 5d 20 32 30 31 31 2d 30 35 2d 31 38  d57f] 2011-05-18
37ed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
37ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
37ef0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61  (pPager, 1, &pPa
37f00 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  geOne);.        
37f10 70 4c 69 73 74 20 3d 20 70 50 61 67 65 4f 6e 65  pList = pPageOne
37f20 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
37f30 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
37f40 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
37f50 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
37f60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c   );.      if( AL
37f70 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
37f80 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
37f90 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
37fa0 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72  r, pList, pPager
37fb0 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20  ->dbSize, 1, .  
37fc0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
37fd0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50  r->fullSync ? pP
37fe0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
37ff0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
38000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
38010 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
38020 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20  pPageOne);.     
38030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
38040 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
38050 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
38060 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
38070 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  che);.      }.  
38080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
38090 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
380a0 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68  block updates th
380b0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
380c0 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74  . Exactly how it
380d0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74  .      ** does t
380e0 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  his depends on w
380f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
38100 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
38110 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
38120 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65     ** was enable
38130 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
38140 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74  e, and if this t
38150 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73  ransaction meets
38160 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72   the .      ** r
38170 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20  untime criteria 
38180 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61  to use the opera
38190 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a  tion: .      **.
381a0 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68        **    * Th
381b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
381c0 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
381d0 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
381e0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20   for.      **   
381f0 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
38200 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
38210 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20   .      **    * 
38220 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e  This commit is n
38230 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  ot part of a mul
38240 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
38250 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ion, and.      *
38260 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f  *    * Exactly o
38270 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
38280 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
38290 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
382a0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
382b0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
382c0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  e optimization w
382d0 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61  as not enabled a
382e0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
382f0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  then the.      *
38300 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
38310 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e  ngecounter() fun
38320 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
38330 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
38340 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ange.      ** co
38350 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
38360 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
38370 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
38380 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
38390 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  .      ** is not
383a0 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74   applicable to t
383b0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
383c0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75   call sqlite3Jou
383d0 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20  rnalCreate().   
383e0 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75     ** to make su
383f0 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  re the journal f
38400 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ile has actually
38410 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74   been created, t
38420 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a  hen call.      *
38430 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
38440 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20  ngecounter() to 
38450 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
38460 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64  e-counter in ind
38470 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d  irect.      ** m
38480 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ode. .      **. 
38490 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
384a0 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  e, if the optimi
384b0 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65  zation is both e
384c0 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69  nabled and appli
384d0 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20  cable,.      ** 
384e0 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f  then call pager_
384f0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
38500 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
38510 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
38520 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64  r.      ** in 'd
38530 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20  irect' mode. In 
38540 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
38550 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
38560 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a  never be.      *
38570 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  * created for th
38580 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
38590 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65        */.  #ifde
385a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
385b0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
385c0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
385d0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
385e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
385f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
38600 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
38610 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
38620 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
38630 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
38640 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
38650 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
38660 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
38670 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
38680 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  r && isOpen(pPag
38690 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  er->jfd) .      
386a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
386b0 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
386c0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a  erSize(pPager) .
386d0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
386e0 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72  ->dbSize>=pPager
386f0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20 20 20  ->dbOrigSize.   
38700 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20      && (0==(pPg 
38710 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
38720 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
38730 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d  >pPCache)) || 0=
38740 3d 70 50 67 2d