/ Hex Artifact Content
Login

Artifact 85988507fa20acc60defb834722eddf4633e4aeb:


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: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
7100: 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75  l if true */.  u
7110: 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20  8 fullSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
7130: 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20   extra syncs of 
7140: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
7150: 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20  robustness */.  
7160: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7170: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7180: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
7190: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
71a0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
71b0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
71c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
71d0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
71e0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
71f0: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7200: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7210: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7220: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7230: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7240: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7260: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7270: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
7280: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72a0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
72b0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
72c0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72e0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
72f0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
7300: 2f 0a 0a 20 20 2f 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 2a 2a 2a 2a 2a 2a  ****************
7350: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7360: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7370: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7380: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7390: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
73a0: 6f 75 74 69 6e 65 20 6f 70 65 72 74 69 6f 6e 2e  outine opertion.
73b0: 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73 20    Class members 
73c0: 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f 63  not in this bloc
73d0: 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69 78  k are either fix
73e0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  ed.  ** when the
73f0: 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74 20   pager is first 
7400: 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65 20  created or else 
7410: 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65 6e  only change when
7420: 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a 2a   there is a.  **
7430: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f 64   significant mod
7440: 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20 61  e change (such a
7450: 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 70  s changing the p
7460: 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e  age_size, lockin
7470: 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72 20  g_mode,.  ** or 
7480: 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
7490: 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  ).  From another
74a0: 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c 61   view, these cla
74b0: 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72  ss members descr
74c0: 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73 74  ibe.  ** the "st
74d0: 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67 65  ate" of the page
74e0: 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20 63  r, while other c
74f0: 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73  lass members des
7500: 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20 22  cribe the.  ** "
7510: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 6f  configuration" o
7520: 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  f the pager..  *
7530: 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20 20  /.  u8 eState;  
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20 28  /* Pager state (
7560: 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57 52  OPEN, READER, WR
7570: 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a  ITER_LOCKED..) *
7580: 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20  /.  u8 eLock;   
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20  /* Current lock 
75b0: 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73 65  held on database
75c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63 68   file */.  u8 ch
75d0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20  angeCountDone;  
75e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66         /* Set af
75f0: 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ter incrementing
7600: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
7610: 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  ter */.  u8 setM
7620: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
7630: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7640: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
7650: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
7660: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
7670: 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20  tSpill;         
7680: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7690: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 77  pill the cache w
76a0: 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a  hen non-zero */.
76b0: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 53 70    u8 doNotSyncSp
76c0: 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ill;          /*
76d0: 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73 70 69   Do not do a spi
76e0: 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ll that requires
76f0: 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a 20 20   jrnl sync */.  
7700: 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8 subjInMemory;
7710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7720: 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65  rue to use in-me
7730: 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
7740: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69  s */.  Pgno dbSi
7750: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7760: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7770: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7780: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
7790: 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20  dbOrigSize;     
77a0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
77b0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
77c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
77d0: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65  */.  Pgno dbFile
77e0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
7800: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
7810: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
7820: 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b 20 20  no dbHintSize;  
7830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
7840: 75 65 20 70 61 73 73 65 64 20 74 6f 20 46 43 4e  ue passed to FCN
7850: 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c  TL_SIZE_HINT cal
7860: 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  l */.  int errCo
7870: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
7880: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
7890: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
78a0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rors */.  int nR
78b0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
78c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6a        /* Pages j
78d0: 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20  ournalled since 
78e0: 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77 72  last j-header wr
78f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63  itten */.  u32 c
7900: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
7910: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
7920: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
7930: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
7940: 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53  ksum */.  u32 nS
7950: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
7960: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7970: 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74 74  of records writt
7980: 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61  en to sub-journa
7990: 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  l */.  Bitvec *p
79a0: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
79b0: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
79c0: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
79d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
79e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
79f0: 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20  le *fd;         
7a00: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a10: 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73  ptor for databas
7a20: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
7a30: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
7a40: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a50: 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a  iptor for main j
7a60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
7a70: 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20  te3_file *sjfd; 
7a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7a90: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73  descriptor for s
7aa0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7ab0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7ad0: 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66  urrent write off
7ae0: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
7af0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
7b00: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
7b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7b20: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
7b30: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
7b40: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
7b50: 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
7b60: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
7b70: 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e  o list of ongoin
7b80: 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  g backup process
7b90: 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76  es */.  PagerSav
7ba0: 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69  epoint *aSavepoi
7bb0: 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  nt; /* Array of 
7bc0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
7bd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65  s */.  int nSave
7be0: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  point;          
7bf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7c00: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76  elements in aSav
7c10: 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68  epoint[] */.  ch
7c20: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7c30: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7c40: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7c50: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7c60: 67 65 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ges */.  /*.  **
7c70: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
7c80: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
7c90: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
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 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
7cf0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
7d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7d10: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
7d20: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
7d30: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
7d40: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
7d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7d60: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
7d70: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
7d80: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
7d90: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
7da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
7db0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
7dc0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
7dd0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
7de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
7df0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
7e00: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
7e10: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
7e20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7e30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7e40: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
7e50: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e70: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
7e80: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
7e90: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
7ea0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
7eb0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
7ec0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
7ed0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
7ee0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
7ef0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
7f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7f20: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
7f30: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7f40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7f50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7f60: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
7f70: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
7f80: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
7f90: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
7fa0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
7fb0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
7fc0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
7fd0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
7fe0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
7ff0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
8000: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8010: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
8020: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
8030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8040: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8070: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8080: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8090: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
80a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
80b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
80c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
80d0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
80e0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
80f0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
8100: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
8110: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
8120: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
8130: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8140: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8150: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8160: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8170: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8180: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8190: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
81a0: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
81b0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
81c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
81d0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
81e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
81f0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
8200: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
8210: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
8220: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
8230: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
8240: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8250: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8260: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8270: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8280: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8290: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
82a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
82b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
82c0: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
82d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
82e0: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
82f0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
8300: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
8310: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
8320: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
8330: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
8340: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8350: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8360: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8370: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8380: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8390: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
83a0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
83b0: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
83c0: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
83d0: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
83e0: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
83f0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
8400: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
8410: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
8420: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
8430: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
8440: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8450: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8460: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8470: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8480: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8490: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
84a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
84b0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
84c0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
84d0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
84e0: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
84f0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
8500: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
8510: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
8520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8530: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
8540: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8550: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8560: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8570: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8580: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8590: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
85a0: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
85b0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
85c0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
85d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
85e0: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
85f0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8600: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
8610: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
8620: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
8630: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
8640: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8650: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8660: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8670: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8680: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8690: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
86a0: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
86b0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
86c0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
86d0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
86e0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
86f0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
8700: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
8710: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8720: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
8730: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
8740: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8750: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8760: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8770: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8780: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8790: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
87a0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
87b0: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
87c0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
87d0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
87e0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
87f0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8800: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8810: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8820: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8830: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8840: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8850: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8860: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8870: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8880: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8890: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
88a0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
88b0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
88c0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
88d0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
88e0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
88f0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8900: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8910: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8920: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8930: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8940: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8950: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8960: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8970: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8980: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8990: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
89a0: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
89b0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
89c0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
89d0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
89e0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
89f0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8a00: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8a10: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8a20: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8a30: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8a40: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8a50: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8a60: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8a70: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8a80: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8a90: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8aa0: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8ab0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8ac0: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8ad0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8ae0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8af0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8b00: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8b10: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8b20: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8b30: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8b40: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8b50: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8b60: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8b70: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8b80: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8b90: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8ba0: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8bb0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8bc0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8bd0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8be0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8bf0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
8c00: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
8c10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
8c20: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
8c30: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
8c40: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
8c50: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
8c60: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
8c70: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
8c80: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8c90: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
8ca0: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
8cb0: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
8cc0: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
8cd0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
8ce0: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
8cf0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
8d00: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
8d10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
8d20: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
8d30: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
8d40: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
8d50: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
8d60: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
8d70: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
8d80: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
8d90: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
8da0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
8db0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
8dc0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
8dd0: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
8de0: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
8df0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
8e00: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
8e10: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
8e20: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
8e30: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
8e40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
8e50: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
8e60: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
8e70: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
8e80: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
8e90: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
8ea0: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
8eb0: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
8ec0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
8ed0: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
8ee0: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
8ef0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
8f00: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
8f10: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
8f20: 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33  or (type sqlite3
8f30: 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75  _file*)..** Retu
8f40: 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f  rn 0 if it is no
8f50: 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a  t open, or non-z
8f60: 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20  ero (but not 1) 
8f70: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
8f80: 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  This is so that 
8f90: 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20  expressions can 
8fa0: 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a  be written as:.*
8fb0: 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65  *.**   if( isOpe
8fc0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
8fd0: 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74  { ....**.** inst
8fe0: 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69  ead of.**.**   i
8ff0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  f( pPager->jfd->
9000: 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a  pMethods ){ ....
9010: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65  */.#define isOpe
9020: 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70  n(pFd) ((pFd)->p
9030: 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20  Methods)../*.** 
9040: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
9050: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
9060: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
9070: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
9080: 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63  usual.** rollbac
9090: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72  k journal. Other
90a0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
90b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
90c0: 49 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e  IT_WAL.static in
90d0: 74 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61  t pagerUseWal(Pa
90e0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
90f0: 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e  return (pPager->
9100: 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73  pWal!=0);.}.#els
9110: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
9120: 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65  UseWal(x) 0.# de
9130: 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61  fine pagerRollba
9140: 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  ckWal(x) 0.# def
9150: 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d  ine pagerWalFram
9160: 65 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20  es(v,w,x,y) 0.# 
9170: 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e  define pagerOpen
9180: 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20  WalIfPresent(z) 
9190: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
91a0: 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  ne pagerBeginRea
91b0: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20  dTransaction(z) 
91c0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
91d0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
91e0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
91f0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
9200: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
9210: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a  e(pPager) );.**.
9220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9230: 20 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72   runs many asser
9240: 74 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e  ts to try to fin
9250: 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65  d inconsistencie
9260: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65  s in.** the inte
9270: 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
9280: 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a  e Pager object..
9290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73  */.static int as
92a0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
92b0: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61  (Pager *p){.  Pa
92c0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b  ger *pPager = p;
92d0: 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73  ..  /* State mus
92e0: 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20  t be valid. */. 
92f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9300: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20  te==PAGER_OPEN. 
9310: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9320: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
9330: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9340: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9350: 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
9360: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9370: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
9380: 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
9390: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
93a0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20  WRITER_DBMOD.   
93b0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
93c0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
93d0: 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c  INISHED.       |
93e0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
93f0: 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20  ER_ERROR.  );.. 
9400: 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f   /* Regardless o
9410: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
9420: 61 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65  ate, a temp-file
9430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61   connection alwa
9440: 79 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20  ys behaves.  ** 
9450: 61 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20  as if it has an 
9460: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
9470: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
9480: 69 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70  ile. It never up
9490: 64 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63  dates.  ** the c
94a0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
94b0: 65 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e  eld, so the chan
94c0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
94d0: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a   is always set..
94e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
94f0: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9500: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9510: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  SIVE_LOCK );.  a
9520: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9530: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
9540: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
9550: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9560: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67   useJournal flag
9570: 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a   is clear, the j
9580: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74  ournal-mode must
9590: 20 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a   be "OFF". .  **
95a0: 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72   And if the jour
95b0: 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46  nal-mode is "OFF
95c0: 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ", the journal f
95d0: 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ile must not be 
95e0: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  open..  */.  ass
95f0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9600: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9610: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d  ALMODE_OFF || p-
9620: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
9630: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9640: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
9650: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9660: 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  | !isOpen(p->jfd
9670: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
9680: 20 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c   that MEMDB impl
9690: 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20  ies noSync. And 
96a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
96b0: 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a  rnal. Since .  *
96c0: 2a 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20  * this means an 
96d0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
96e0: 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61  performs no IO a
96f0: 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74  t all, it cannot
9700: 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a   encounter .  **
9710: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49   either SQLITE_I
9720: 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46  OERR or SQLITE_F
9730: 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ULL during rollb
9740: 61 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e  ack or while fin
9750: 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20  alizing .  ** a 
9760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61  journal file. (a
9770: 6c 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d  lthough the in-m
9780: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d  emory journal im
9790: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
97a0: 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51   .  ** return SQ
97b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
97c0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
97d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
97e0: 20 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20   written). It . 
97f0: 20 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65   ** is therefore
9800: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
9810: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r an in-memory p
9820: 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
9830: 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74  e ERROR .  ** st
9840: 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ate..  */.  if( 
9850: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
9860: 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29  ert( p->noSync )
9870: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
9880: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9890: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
98a0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  OFF .         ||
98b0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
98c0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
98d0: 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29  DE_MEMORY .    )
98e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
98f0: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
9900: 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74  RROR && p->eStat
9910: 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e!=PAGER_OPEN );
9920: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
9930: 65 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29  erUseWal(p)==0 )
9940: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  ;.  }..  /* If c
9950: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69  hangeCountDone i
9960: 73 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45  s set, a RESERVE
9970: 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  D lock or greate
9980: 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20  r must be held. 
9990: 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e   ** on the file.
99a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
99b0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
99c0: 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50  untDone==0 || pP
99d0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  ager->eLock>=RES
99e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
99f0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9a00: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
9a10: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ;..  switch( p->
9a20: 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  eState ){.    ca
9a30: 73 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20  se PAGER_OPEN:. 
9a40: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
9a50: 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73  MDB );.      ass
9a60: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9a70: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9a80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9a90: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
9aa0: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
9ab0: 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50  PCache)==0 || pP
9ac0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
9ad0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
9ae0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52      case PAGER_R
9af0: 45 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73  EADER:.      ass
9b00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9b10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9b20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9b30: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9b40: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9b50: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9b60: 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
9b70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
9b80: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
9b90: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20  RITER_LOCKED:.  
9ba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9bb0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
9bc0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
9bd0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9be0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9bf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
9c00: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
9c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
9c20: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45  rt( p->eLock>=RE
9c30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
9c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9c50: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
9c60: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ize==pPager->dbO
9c70: 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  rigSize );.     
9c80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9c90: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9ca0: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
9cb0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9cc0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9cd0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
9ce0: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
9cf0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9d00: 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
9d10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9d20: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9d30: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20  ITER_CACHEMOD:. 
9d40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9d50: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9d60: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9d70: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9d80: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9d90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61  );.      if( !pa
9da0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
9db0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9dc0: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
9dd0: 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d  hat if journal_m
9de0: 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61  ode=wal here tha
9df0: 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20  t neither the.  
9e00: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
9e10: 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41   file nor the WA
9e20: 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e  L file are open.
9e30: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75   This happens du
9e40: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
9e50: 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  a rollback trans
9e60: 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74  action that swit
9e70: 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ches from journa
9e80: 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20  l_mode=off.     
9e90: 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c     ** to journal
9ea0: 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20  _mode=wal..     
9eb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
9ec0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9ed0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9ee0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9ef0: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
9f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
9f10: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9f20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9f30: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
9f40: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9f50: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9f60: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
9f70: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
9f80: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
9f90: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9fa0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
9fb0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
9fc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9fd0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
9fe0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
9ff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a000: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a010: 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20  RITER_DBMOD:.   
a020: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a030: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a040: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a050: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a060: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a070: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a080: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a090: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
a0a0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a0b0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a0c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a0d0: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a0f0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a100: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a110: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a120: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a130: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a140: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a150: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a160: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a170: 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Size<=pPager->db
a180: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
a190: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a1a0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a1b0: 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20  FINISHED:.      
a1c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a1d0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a1e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1f0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a200: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a220: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a230: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a240: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a250: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
a260: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a270: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a280: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a290: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a2a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a2b0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a2c0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65      );.      bre
a2d0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a2e0: 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  GER_ERROR:.     
a2f0: 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62   /* There must b
a300: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
a310: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
a320: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
a330: 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  r if.      ** in
a340: 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
a350: 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65  herwise the page
a360: 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  r should have al
a370: 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20  ready dropped.  
a380: 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f      ** back to O
a390: 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20  PEN state..     
a3a0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a3b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a3c0: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
a3d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a3e0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
a3f0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
a400: 63 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20  che)>0 );.      
a410: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
a420: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
a430: 20 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55   /* ifndef NDEBU
a440: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
a450: 49 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ITE_DEBUG ./*.**
a460: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
a470: 72 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61  r to a human rea
a480: 64 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20  dable string in 
a490: 61 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a  a static buffer.
a4a0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
a4b0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  e state of the P
a4c0: 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
a4d0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
a4e0: 74 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e  t. This.** is in
a4f0: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
a500: 64 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65  d within debugge
a510: 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
a520: 20 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69   as an alternati
a530: 76 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20  ve.** to "print 
a540: 2a 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a  *pPager" in gdb:
a550: 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69  .**.** (gdb) pri
a560: 6e 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f  ntf "%s", print_
a570: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
a580: 65 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  er).*/.static ch
a590: 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f  ar *print_pager_
a5a0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
a5b0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
a5c0: 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71  Ret[1024];..  sq
a5d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
a5e0: 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20  024, zRet,.     
a5f0: 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20   "Filename:     
a600: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74   %s\n".      "St
a610: 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20  ate:         %s 
a620: 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20  errCode=%d\n".  
a630: 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20      "Lock:      
a640: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
a650: 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20  "Locking mode:  
a660: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c  locking_mode=%s\
a670: 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61  n".      "Journa
a680: 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c  l mode:  journal
a690: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
a6a0: 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65    "Backing store
a6b0: 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65  : tempFile=%d me
a6c0: 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61  mDb=%d useJourna
a6d0: 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a  l=%d\n".      "J
a6e0: 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f  ournal:       jo
a6f0: 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f  urnalOff=%lld jo
a700: 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22  urnalHdr=%lld\n"
a710: 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20  .      "Size:   
a720: 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64         dbsize=%d
a730: 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64   dbOrigSize=%d d
a740: 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a  bFileSize=%d\n".
a750: 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65        , p->zFile
a760: 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  name.      , p->
a770: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
a780: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20  EN            ? 
a790: 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20  "OPEN" :.       
a7a0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a7b0: 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20  R_READER        
a7c0: 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20    ? "READER" :. 
a7d0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a7e0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
a7f0: 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45  OCKED   ? "WRITE
a800: 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20  R_LOCKED" :.    
a810: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a820: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a830: 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43  EMOD ? "WRITER_C
a840: 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20  ACHEMOD" :.     
a850: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a860: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
a870: 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42      ? "WRITER_DB
a880: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a890: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a8a0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
a8b0: 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ? "WRITER_FINISH
a8c0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a8d0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
a8e0: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f  RROR           ?
a8f0: 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72   "ERROR" : "?err
a900: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
a910: 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  t)p->errCode.   
a920: 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e     , p->eLock==N
a930: 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f  O_LOCK         ?
a940: 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20   "NO_LOCK" :.   
a950: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52       p->eLock==R
a960: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f  ESERVED_LOCK   ?
a970: 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20   "RESERVED" :.  
a980: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
a990: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
a9a0: 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a  ? "EXCLUSIVE" :.
a9b0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
a9c0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  ==SHARED_LOCK   
a9d0: 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20    ? "SHARED" :. 
a9e0: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
a9f0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20  =UNKNOWN_LOCK   
aa00: 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22   ? "UNKNOWN" : "
aa10: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
aa20: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
aa30: 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20  e ? "exclusive" 
aa40: 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20  : "normal".     
aa50: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64   , p->journalMod
aa60: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aa70: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20  MODE_MEMORY   ? 
aa80: 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20  "memory" :.     
aa90: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
aaa0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aab0: 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20  MODE_OFF      ? 
aac0: 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20  "off" :.        
aad0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aae0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aaf0: 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65  E_DELETE   ? "de
ab00: 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  lete" :.        
ab10: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
ab20: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
ab30: 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65  E_PERSIST  ? "pe
ab40: 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20  rsist" :.       
ab50: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
ab60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ab70: 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74  DE_TRUNCATE ? "t
ab80: 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20  runcate" :.     
ab90: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
aba0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
abb0: 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20  MODE_WAL      ? 
abc0: 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f  "wal" : "?error?
abd0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
abe0: 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74  ->tempFile, (int
abf0: 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29  )p->memDb, (int)
ac00: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  p->useJournal.  
ac10: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
ac20: 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48  Off, p->journalH
ac30: 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  dr.      , (int)
ac40: 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29  p->dbSize, (int)
ac50: 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28  p->dbOrigSize, (
ac60: 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a  int)p->dbFileSiz
ac70: 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e.  );..  return
ac80: 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
ac90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
aca0: 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65  ue if it is nece
acb0: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70  ssary to write p
acc0: 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68  age *pPg into th
acd0: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a  e sub-journal..*
ace0: 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74  * A page needs t
acf0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
ad00: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
ad10: 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  l if there exist
ad20: 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65  s one.** or more
ad30: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
ad40: 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a   for which:.**.*
ad50: 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e  *   * The page-n
ad60: 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
ad70: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50  an or equal to P
ad80: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f  agerSavepoint.nO
ad90: 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  rig, and.**   * 
ada0: 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  The bit correspo
adb0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  nding to the pag
adc0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20  e-number is not 
add0: 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61  set in.**     Pa
ade0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
adf0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  Savepoint..*/.st
ae00: 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71  atic int subjReq
ae10: 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20  uiresPage(PgHdr 
ae20: 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67  *pPg){.  Pgno pg
ae30: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
ae40: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
ae50: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
ae60: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
ae70: 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  0; i<pPager->nSa
ae80: 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  vepoint; i++){. 
ae90: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
aea0: 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
aeb0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20  aSavepoint[i];. 
aec0: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e     if( p->nOrig>
aed0: 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69  =pgno && 0==sqli
aee0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d  te3BitvecTest(p-
aef0: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
af00: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  gno) ){.      re
af10: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
af20: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
af30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
af40: 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ue if the page i
af50: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
af60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
af70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
af80: 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72  eInJournal(PgHdr
af90: 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
afa0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
afb0: 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  st(pPg->pPager->
afc0: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
afd0: 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pgno);.}../*.**
afe0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
aff0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
b000: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b010: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
b020: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
b030: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
b040: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
b050: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
b060: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
b070: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
b080: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b090: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
b0a0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
b0b0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b0c0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b0d0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b0e0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b0f0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b100: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b110: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b120: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b130: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b140: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b150: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b160: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b170: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b180: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b190: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b1a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b1b0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b1c0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b1d0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b1e0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b1f0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b200: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b210: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b220: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b230: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b240: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b250: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b260: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
b270: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
b280: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
b290: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b2a0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b2c0: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
b2d0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b2e0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
b2f0: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
b300: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
b310: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
b320: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
b330: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
b340: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
b350: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b360: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b370: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b380: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
b390: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
b3a0: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
b3b0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
b3c0: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
b3d0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
b3e0: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
b3f0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
b400: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
b410: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
b420: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
b430: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b440: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b450: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b460: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
b470: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
b480: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
b490: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
b4a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
b4b0: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
b4c0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b4d0: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
b4e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b4f0: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
b500: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b510: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b520: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b530: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
b540: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
b550: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
b560: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
b570: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
b580: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
b590: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
b5a0: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
b5b0: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
b5c0: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
b5d0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
b5e0: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
b5f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
b600: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
b610: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b620: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
b630: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
b640: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
b650: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
b660: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
b670: 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65  r->eLock = (u8)e
b680: 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Lock;.    }.    
b690: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
b6a0: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
b6b0: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20  r, eLock)).  }. 
b6c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b6d0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61  *.** Lock the da
b6e0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b6f0: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b700: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b710: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a   SHARED_LOCK,.**
b720: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
b730: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
b740: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
b750: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  is successful, s
b760: 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  et the.** Pager.
b770: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b780: 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  o the new lockin
b790: 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  g state. .**.** 
b7a0: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
b7b0: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
b7c0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
b7d0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b7e0: 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20   is .** called, 
b7f0: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b800: 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20   unless the new 
b810: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73  locking state is
b820: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
b830: 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d   .** See the com
b840: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b850: 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57  define of UNKNOW
b860: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
b870: 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66  planation .** of
b880: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b890: 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62   int pagerLockDb
b8a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b8b0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b8c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b8d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  ;..  assert( eLo
b8e0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b8f0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  || eLock==RESERV
b900: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
b910: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b920: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
b930: 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c  ->eLock<eLock ||
b940: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
b950: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
b960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b970: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
b980: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
b990: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b9a0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
b9b0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
b9c0: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
b9d0: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
b9e0: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
b9f0: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
ba00: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
ba10: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
ba20: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
ba30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
ba40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
ba50: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
ba60: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
ba70: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
ba80: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
ba90: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
baa0: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
bab0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
bac0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
bad0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
bae0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
baf0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
bb00: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
bb10: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
bb20: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
bb30: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
bb40: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
bb50: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
bb60: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
bb70: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
bb80: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
bb90: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
bba0: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
bbb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
bbc0: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
bbd0: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
bbe0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
bbf0: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
bc00: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
bc10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
bc20: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
bc30: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
bc40: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
bc50: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
bc60: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
bc70: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
bc80: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
bc90: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
bca0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
bcb0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
bcc0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
bcd0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
bce0: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
bcf0: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
bd00: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
bd10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
bd20: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
bd30: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
bd40: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
bd50: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
bd60: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
bd70: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
bd80: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
bd90: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
bdc0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
bdd0: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
be00: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
be10: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
be20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
be30: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
be40: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
be50: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
be60: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
be70: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
be80: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
be90: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
bea0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
beb0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
bec0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
bed0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
bee0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
bef0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
bf00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
bf10: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
bf20: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
bf30: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
bf40: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
bf50: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
bf60: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
bf70: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
bf80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
bf90: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
bfa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
bfb0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
bfc0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
bfd0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
bfe0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
bff0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
c000: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
c010: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
c020: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
c030: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
c040: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
c050: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
c060: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
c070: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
c080: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c090: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
c0a0: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
c0b0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
c0c0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
c0d0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
c0e0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
c0f0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
c100: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
c110: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
c120: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
c130: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
c140: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
c150: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
c160: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
c170: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
c180: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
c190: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
c1a0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
c1b0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
c1c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
c1d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
c1e0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
c1f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c200: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
c210: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
c220: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
c230: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
c240: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
c250: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
c260: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
c270: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
c280: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
c290: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
c2a0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
c2b0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
c2c0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
c2d0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
c2e0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
c2f0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
c300: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
c310: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
c320: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
c330: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
c340: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
c350: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
c360: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
c370: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
c380: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
c390: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
c3a0: 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
c3b0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
c3c0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d  .  assert( (pPg-
c3d0: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
c3e0: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
c3f0: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
c400: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
c410: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
c420: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
c430: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
c440: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
c450: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
c460: 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a  set_pagehash(X).
c470: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
c480: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
c490: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c4a0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
c4b0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
c4c0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
c4d0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
c4e0: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
c4f0: 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
c500: 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
c510: 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ead a master jou
c520: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66  rnal file name f
c530: 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20  rom the .** end 
c540: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c  of the file and,
c550: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
c560: 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d  copies it into m
c570: 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a  emory supplied .
c580: 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
c590: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
c5a0: 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72  bove writeMaster
c5b0: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68  Journal() for th
c5c0: 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64  e format.** used
c5d0: 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74   to store a mast
c5e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
c5f0: 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20  name at the end 
c600: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  of a journal fil
c610: 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72  e..**.** zMaster
c620: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
c630: 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
c640: 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65  ast nMaster byte
c650: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
c660: 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  * the caller. Th
c670: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c  is should be sql
c680: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
c690: 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65  ame+1 (to ensure
c6a0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f   there is.** eno
c6b0: 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69  ugh space to wri
c6c0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c6d0: 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20  urnal name). If 
c6e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c6f0: 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  al.** name in th
c700: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e  e journal is lon
c710: 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72  ger than nMaster
c720: 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e   bytes (includin
c730: 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  g a.** nul-termi
c740: 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69  nator), then thi
c750: 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20  s is handled as 
c760: 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  if no master jou
c770: 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72  rnal name.** wer
c780: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
c790: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c7a0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
c7b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c7c0: 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20   present at the 
c7d0: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
c7e0: 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  al.** file, then
c7f0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
c800: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
c810: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
c820: 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65  ter. A.** nul-te
c830: 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
c840: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
c850: 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e   buffer followin
c860: 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  g the master.** 
c870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c880: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  e..**.** If it i
c890: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  s determined tha
c8a0: 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  t no master jour
c8b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c8c0: 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61   present .** zMa
c8d0: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
c8e0: 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
c8f0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
c900: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
c910: 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69  curs while readi
c920: 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
c930: 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c  nal file, an SQL
c940: 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  ite.** error cod
c950: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
c960: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
c970: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
c980: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
c990: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
c9a0: 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b  r, u32 nMaster){
c9b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c9d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
c9e0: 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20    u32 len;      
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ca00: 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  Length in bytes 
ca10: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
ca20: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20  l name */.  i64 
ca30: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
ca40: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
ca50: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
ca60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a   journal file pJ
ca70: 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  rnl */.  u32 cks
ca80: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
ca90: 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73      /* MJ checks
caa0: 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  um value read fr
cab0: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  om journal */.  
cac0: 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
cad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
cae0: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
caf0: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
cb00: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
cb10: 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20  ;   /* A buffer 
cb20: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
cb30: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d  c header */.  zM
cb40: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
cb50: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
cb60: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
cb70: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
cb80: 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73  , &szJ)).   || s
cb90: 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49  zJ<16.   || SQLI
cba0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
cbb0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
cbc0: 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20  zJ-16, &len)).  
cbd0: 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72   || len>=nMaster
cbe0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
cbf0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cc00: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cc10: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
cc20: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cc30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cc40: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
cc50: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
cc60: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
cc70: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
cc80: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
cc90: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
cca0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
ccb0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
ccc0: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
ccd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
cce0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
ccf0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
cd00: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
cd10: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
cd20: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
cd30: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
cd40: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
cd50: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
cd60: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
cd70: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
cd80: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
cd90: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
cda0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
cdb0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
cdc0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cdd0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
cde0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
cdf0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
ce00: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
ce10: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
ce20: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
ce30: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
ce40: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
ce50: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
ce60: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
ce70: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
ce80: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
ce90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cea0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
ceb0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
cec0: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
ced0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
cee0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
cef0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
cf00: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
cf10: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
cf20: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
cf30: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
cf40: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
cf50: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
cf60: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
cf70: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
cf80: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
cf90: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
cfa0: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
cfd0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
cff0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d060: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d070: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d080: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d090: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d0a0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d0b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d0c0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d0d0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d0e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d0f0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d100: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d110: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d120: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d130: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d140: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d150: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d160: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d170: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d180: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d190: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d1a0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d1b0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d1c0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d1d0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d1e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d1f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d200: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d210: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d220: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d230: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d240: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d250: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d260: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d270: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d280: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d290: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d2a0: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d2b0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d2c0: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d2d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d2e0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d2f0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d300: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d310: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d320: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d340: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d350: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d360: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d370: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d380: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d390: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d3a0: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d3b0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d3c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d3d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d3e0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d3f0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d400: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d410: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d420: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d430: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d440: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d450: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d460: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d470: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d480: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d490: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d4a0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d4b0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d4c0: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d4d0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d4e0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d4f0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d500: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d510: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d520: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
d530: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d540: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d550: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
d560: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
d570: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d580: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
d590: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
d5a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d5b0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
d5c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d5d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
d600: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
d610: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
d620: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
d630: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
d640: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
d650: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
d660: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d670: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
d680: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
d690: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
d6a0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
d6b0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
d6c0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
d6d0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
d6e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
d6f0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
d700: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
d710: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
d720: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
d730: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
d740: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d750: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
d760: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
d770: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
d780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d790: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d7a0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
d7b0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
d7c0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
d7d0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
d7e0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
d7f0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
d800: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d810: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d820: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
d830: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
d840: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
d850: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
d860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
d870: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
d880: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
d890: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
d8a0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
d8b0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
d8c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
d8d0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
d8e0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
d8f0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
d900: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
d910: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
d920: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
d930: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
d940: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
d950: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d960: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
d970: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d980: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
d990: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
d9a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d9b0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
d9c0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
d9d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d9e0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
d9f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
da00: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
da10: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
da20: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
da30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
da40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
da50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
da60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
da70: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
da80: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
da90: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
daa0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
dab0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
dac0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
dad0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
dae0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
daf0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
db00: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
db10: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
db20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
db30: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
db40: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
db50: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
db60: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
db70: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
db80: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
db90: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
dba0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dbb0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
dbc0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
dbd0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dbe0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
dbf0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
dc00: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
dc10: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
dc20: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
dc30: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
dc40: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
dc50: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
dc60: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
dc70: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
dc80: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
dc90: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
dca0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
dcb0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
dcc0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
dcd0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
dce0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
dcf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dd00: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
dd10: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
dd20: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
dd30: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
dd40: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
dd50: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
dd60: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
dd70: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
dd80: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
dd90: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
dda0: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
ddb0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
dde0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
ddf0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
de00: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de20: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
de30: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
de40: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
de50: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
de60: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
de70: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
de80: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
de90: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
dea0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
deb0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
dec0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
ded0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
dee0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
def0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
df00: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
df10: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
df20: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
df30: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
df40: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
df50: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
df60: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
df70: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
df80: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
df90: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
dfa0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
dfb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
dfc0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
dfd0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
dfe0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
dff0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e000: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e010: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e020: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e030: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e040: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e050: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e060: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e070: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e080: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e090: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e0a0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e0b0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e0c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e0d0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e0e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e0f0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e100: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e110: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e120: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e130: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e140: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e150: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e160: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e170: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e180: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e190: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e1a0: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e1b0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e1c0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e1d0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e1e0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e1f0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e200: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e210: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e220: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e230: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e240: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e250: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e270: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e280: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e290: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e2a0: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e2b0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e2c0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e2d0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e2e0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e2f0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e300: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e310: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e320: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e330: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e340: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e350: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e360: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e370: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e380: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e390: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e3a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e3b0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e3c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e3d0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e3e0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e3f0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e400: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e410: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e420: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e430: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e440: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e450: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e460: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e470: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e480: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e490: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e4a0: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e4b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e4c0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e4d0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e4e0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e4f0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e500: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e510: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e520: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
e530: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
e540: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
e550: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
e560: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e570: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e580: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
e590: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
e5a0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
e5b0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
e5c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e5d0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
e5e0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
e5f0: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
e600: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
e610: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
e620: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e630: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
e640: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
e650: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e660: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e670: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
e680: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
e690: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
e6a0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
e6b0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e6c0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e6d0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
e6e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
e6f0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
e700: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
e710: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
e720: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e730: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e740: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
e750: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
e760: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
e770: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
e780: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e790: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e7a0: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
e7b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
e7c0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
e7d0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
e7e0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
e7f0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
e800: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
e810: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
e820: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
e830: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
e840: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
e850: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
e860: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
e870: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
e880: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
e890: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
e8a0: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
e8b0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
e8c0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
e8d0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e8e0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
e8f0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
e900: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
e910: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
e920: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
e930: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
e940: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
e950: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
e960: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
e970: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
e980: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
e990: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
e9a0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
e9b0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
e9c0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
e9d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
e9e0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
e9f0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
ea00: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
ea10: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
ea20: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
ea30: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
ea40: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
ea50: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
ea60: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
ea70: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
ea80: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
ea90: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
eaa0: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
eab0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
eac0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
ead0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
eae0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
eaf0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
eb00: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
eb10: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
eb20: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
eb30: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
eb40: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
eb50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
eb60: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
eb70: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
eb80: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
eb90: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
eba0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
ebb0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
ebc0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
ebd0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
ebe0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
ebf0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
ec00: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
ec10: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
ec20: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
ec30: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
ec40: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
ec50: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
ec60: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
ec70: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
ec80: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
ec90: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
eca0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
ecb0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
ecc0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
ecd0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
ece0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
ecf0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
ed00: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
ed10: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
ed20: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
ed30: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
ed40: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
ed50: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
ed60: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
ed70: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
ed80: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
ed90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
eda0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
edb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
edc0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
edd0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
ede0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
edf0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
ee00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ee10: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
ee20: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
ee30: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
ee40: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
ee50: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
ee60: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ee70: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
ee80: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
ee90: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
eea0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
eeb0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
eec0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
eed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
eee0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
eef0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
ef00: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
ef10: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
ef20: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
ef30: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
ef40: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
ef50: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
ef60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
ef70: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
ef80: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
ef90: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
efa0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
efb0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
efc0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
efd0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
efe0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
eff0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f000: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f010: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f020: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f030: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f040: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f050: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f060: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f070: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f080: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f090: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f0a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f0b0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f0c0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f0d0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f0e0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f0f0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f100: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f110: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f120: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f130: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f140: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f150: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f160: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f170: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f180: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f190: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f1a0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f1b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f1c0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f1d0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f1e0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f1f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f200: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f210: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f220: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f240: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f250: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f260: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f270: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f280: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f290: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f2a0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f2b0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f2c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f2e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f2f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f300: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f310: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f320: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f330: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f350: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f360: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f370: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f380: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f390: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f3a0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f3b0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f3c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f3d0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f3e0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f3f0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f400: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f410: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f420: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f430: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f440: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f450: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f470: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f480: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f490: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f4a0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f4b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f4c0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f4d0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f4e0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f500: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f510: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f520: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
f530: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
f540: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
f550: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
f560: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
f570: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
f580: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
f590: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
f5a0: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
f5b0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
f5c0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
f5d0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f5e0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
f5f0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
f600: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
f610: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
f620: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
f630: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f640: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
f650: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
f660: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
f670: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
f680: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
f690: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
f6a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f6b0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
f6c0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
f6d0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f6e0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
f6f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f700: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
f710: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
f720: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
f730: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
f740: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
f750: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
f760: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
f770: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
f780: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
f790: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
f7a0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
f7b0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
f7c0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f7d0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
f7e0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
f7f0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
f800: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f810: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f820: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
f830: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
f840: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f850: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
f860: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
f870: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
f880: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
f890: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f8a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
f8b0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
f8c0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
f8d0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
f8e0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f8f0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
f900: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
f910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f920: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
f930: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f940: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
f950: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
f960: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
f970: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
f980: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
f990: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
f9a0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
f9b0: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
f9c0: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
f9d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
f9e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f9f0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fa00: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
fa10: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
fa20: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
fa30: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fa40: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fa50: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
fa60: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
fa70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fa80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fa90: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
faa0: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
fab0: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
fac0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
fad0: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
fae0: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
faf0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
fb00: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
fb10: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
fb20: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
fb30: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
fb40: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
fb50: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
fb60: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
fb70: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
fb80: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
fb90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
fba0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
fbb0: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
fbc0: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
fbd0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
fbe0: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
fbf0: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
fc00: 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
fc10: 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
fc20: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
fc30: 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
fc40: 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
fc50: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
fc60: 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
fc70: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
fc80: 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
fc90: 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
fca0: 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
fcb0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
fcc0: 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
fcf0: 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
fd00: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
fd10: 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
fd20: 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
fd30: 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
fd40: 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
fd50: 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
fd60: 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
fd70: 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
fd80: 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
fd90: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
fda0: 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
fdb0: 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
fdc0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
fdd0: 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
fde0: 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
fdf0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
fe00: 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
fe10: 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
fe20: 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
fe30: 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
fe40: 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
fe50: 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
fe60: 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
fe70: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
fe80: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
fe90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
fea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
feb0: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
fec0: 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
fed0: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
fee0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
fef0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
ff00: 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
ff10: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
ff20: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
ff30: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
ff40: 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
ff50: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
ff60: 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
ff70: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
ff80: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
ff90: 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
ffa0: 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
ffb0: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
ffc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
ffd0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
ffe0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
fff0: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10000 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10010 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10020 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10030 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10040 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10050 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10060 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10070 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10080 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10090 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
100a0 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
100b0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
100c0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
100d0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
100e0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
100f0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10100 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10110 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10120 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10130 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10140 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10150 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10160 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10170 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10180 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10190 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
101a0 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
101b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
101c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
101d0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
101e0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
101f0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10200 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10210 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10220 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10230 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10240 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10250 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10260 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10270 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10280 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10290 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
102a0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
102b0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
102c0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
102d0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
102e0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
102f0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10300 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10310 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10320 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10330 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10340 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10350 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10360 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10370 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10380 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10390 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
103a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
103b0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
103c0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
103d0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
103e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103f0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10400 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10410 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10420 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10430 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10440 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10450 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10460 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10470 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10480 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10490 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
104a0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
104b0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
104c0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
104d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
104e0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
104f0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10500 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10510 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10520 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10550 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10570 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10580 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10590 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
105a0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
105b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
105c0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
105d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
105e0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10610 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10620 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10630 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10640 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10650 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10660 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10670 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10680 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10690 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
106a0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
106b0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
106c0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
106d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
106e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
106f0 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  RY .   || pPager
10700 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
10710 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10720 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72  _OFF .  ){.    r
10730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10740 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
10750 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20  etMaster = 1;.  
10760 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
10770 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
10780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10790 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
107a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
107b0 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
107c0 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
107d0 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
107e0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
107f0 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10800 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10810 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10820 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10830 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10840 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10850 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10860 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10870 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10880 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10890 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
108a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
108b0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
108c0 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
108d0 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
108e0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
108f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10900 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10910 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10920 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10930 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10940 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10950 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10960 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10970 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10980 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10990 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
109a0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
109b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
109c0 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
109d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
109e0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
109f0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10a00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
10a10 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
10a20 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10a30 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
10a40 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
10a50 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10a60 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
10a70 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
10a80 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
10a90 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
10aa0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10ab0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10ac0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10ad0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
10ae0 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
10af0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10b00 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10b10 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
10b20 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
10b30 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10b40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10b50 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
10b60 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
10b70 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
10b80 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
10b90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10ba0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
10bb0 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
10bc0 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  er+20);..  /* If
10bd0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10be0 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e   peristent-journ
10bf0 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  al mode, then th
10c00 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a  e physical .  **
10c10 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61   journal-file ma
10c20 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  y extend past th
10c30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73  e end of the mas
10c40 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
10c50 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65  .  ** and 8 byte
10c60 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20  s of magic data 
10c70 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20  just written to 
10c80 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
10c90 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75  s .  ** dangerou
10ca0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  s because the co
10cb0 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  de to rollback a
10cc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
10cd0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
10ce0 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  be able to find 
10cf0 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
10d00 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  al name to deter
10d10 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
10d20 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
10d30 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20  urnal is hot. . 
10d40 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74   **.  ** Easiest
10d50 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20   thing to do in 
10d60 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73  this scenario is
10d70 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
10d80 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
10d90 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69  ile to the requi
10da0 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a  red size..  */ .
10db0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
10dc0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
10dd0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
10de0 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
10df0 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  ).   && jrnlSize
10e00 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  >pPager->journal
10e10 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
10e20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
10e30 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
10e40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e50 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Off);.  }.  retu
10e60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10e70 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
10e80 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
10e90 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
10ea0 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  ber. Return.** a
10eb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10ec0 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
10ed0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
10ee0 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c  ge is not .** al
10ef0 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e  ready in memory.
10f00 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
10f10 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
10f20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
10f30 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
10f40 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f60 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
10f70 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
10f80 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
10f90 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65  call to PcacheFe
10fa0 74 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74  tch() with creat
10fb0 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a  eFlag==0 to.  **
10fc0 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20   fail, since no 
10fd0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
10fe0 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  ate dynamic memo
10ff0 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e  ry will be made.
11000 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
11010 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
11020 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11030 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a  , pgno, 0, &p);.
11040 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
11050 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
11060 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11070 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
11080 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
11090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
110a0 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
110b0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
110c0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
110d0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
110e0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
110f0 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
11100 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
11110 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
11120 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
11130 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
11140 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
11150 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
11160 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
11170 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
11180 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
11190 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
111a0 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
111b0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
111c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
111d0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
111e0 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
111f0 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
11200 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
11210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11220 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
11230 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
11240 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11250 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
11260 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
11270 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
11280 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11290 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
112a0 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
112b0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
112c0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
112d0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
112e0 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
112f0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66  rnal(pPager->sjf
11300 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
11310 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
11320 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >sjfd);.  }.  sq
11330 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
11340 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r->aSavepoint);.
11350 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
11360 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
11370 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
11380 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11390 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ubRec = 0;.}../*
113a0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
113b0 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
113c0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
113d0 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a  t.pInSavepoint .
113e0 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c  ** bitvecs of al
113f0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
11400 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  s. Return SQLITE
11410 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
11420 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  l.** or SQLITE_N
11430 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
11440 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
11450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
11460 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
11470 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
11480 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
11490 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
114a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
114b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
114c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
114d0 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  _OK;       /* Re
114e0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  sult code */..  
114f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11500 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11510 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65   ii++){.    Page
11520 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
11530 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
11540 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  int[ii];.    if(
11550 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20   pgno<=p->nOrig 
11560 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73  ){.      rc |= s
11570 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
11580 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
11590 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65   pgno);.      te
115a0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
115b0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
115c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
115d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
115e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
115f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11610 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11620 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
11630 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11640 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f  sive mode and no
11650 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f  t.** in the ERRO
11660 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
11670 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20  se, it switches 
11680 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47  the pager to PAG
11690 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65  ER_OPEN.** state
116a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
116b0 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
116c0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
116d0 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61  mode, the databa
116e0 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f  se file is.** co
116f0 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65  mpletely unlocke
11700 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  d. If the file i
11710 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74  s unlocked and t
11720 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  he file-system d
11730 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62  oes.** not exhib
11740 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42  it the UNDELETAB
11750 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f  LE_WHEN_OPEN pro
11760 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e  perty, the journ
11770 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c  al file is.** cl
11780 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f  osed (if it is o
11790 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pen)..**.** If t
117a0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45  he pager is in E
117b0 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
117c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
117d0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a   called, the .**
117e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
117f0 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65   pager cache are
11800 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72   discarded befor
11810 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b  e switching back
11820 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e   to .** the OPEN
11830 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65   state. Regardle
11840 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
11850 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11860 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20  clusive-mode.** 
11870 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72  or not, any jour
11880 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e  nal file left in
11890 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
118a0 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
118b0 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  .** as a hot-jou
118c0 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
118d0 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69  back the next ti
118e0 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  me a read-transa
118f0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e  ction.** is open
11900 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62  ed (by this or b
11910 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e  y any other conn
11920 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74  ection)..*/.stat
11930 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
11940 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
11950 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  er){..  assert( 
11960 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11970 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
11980 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
11990 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
119a0 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  EN .       || pP
119b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
119c0 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a  GER_ERROR .  );.
119d0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
119e0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
119f0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
11a00 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
11a10 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  l = 0;.  release
11a20 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
11a30 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61  ager);..  if( pa
11a40 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
11a50 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
11a60 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
11a70 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c  >jfd) );.    sql
11a80 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
11a90 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
11aa0 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61  ->pWal);.    pPa
11ab0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
11ac0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GER_OPEN;.  }els
11ad0 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
11ae0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
11af0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
11b20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65  returned by page
11b30 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20  rUnlockDb() */. 
11b40 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f     int iDc = isO
11b50 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f  pen(pPager->fd)?
11b60 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
11b70 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
11b80 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20  Pager->fd):0;.. 
11b90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65     /* If the ope
11ba0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75  rating system su
11bb0 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f  pport deletion o
11bc0 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68  f open files, th
11bd0 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20  en.    ** close 
11be0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11bf0 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
11c00 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
11c10 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  .  Otherwise.   
11c20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   ** another conn
11c30 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
11c40 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
11c50 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65  might delete the
11c60 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74   file.    ** out
11c70 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
11c80 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11c90 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11ca0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26  LMODE_MEMORY   &
11cb0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11cc0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11cd0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
11ce0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11cf0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11d00 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
11d10 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
11d20 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11d30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
11d40 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20  ELETE   & 5)!=1 
11d50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11d60 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11d70 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d  E_TRUNCATE & 5)=
11d80 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11d90 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11da0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20  MODE_PERSIST  & 
11db0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  5)==1 );.    if(
11dc0 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54   0==(iDc & SQLIT
11dd0 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
11de0 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20  BLE_WHEN_OPEN). 
11df0 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65      || 1!=(pPage
11e00 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26  r->journalMode &
11e10 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   5).    ){.     
11e20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11e30 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
11e40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
11e50 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
11e60 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
11e70 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  nd the call to u
11e80 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
11e90 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66  se.    ** file f
11ea0 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75  ails, set the cu
11eb0 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e  rrent lock to UN
11ec0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
11ed0 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20  the comment.    
11ee0 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  ** above the #de
11ef0 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e  fine for UNKNOWN
11f00 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
11f10 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20  lanation of why 
11f20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e  this.    ** is n
11f30 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
11f40 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
11f50 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
11f60 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  NO_LOCK);.    if
11f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11f80 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
11f90 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e==PAGER_ERROR )
11fa0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
11fb0 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f  eLock = UNKNOWN_
11fc0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LOCK;.    }..   
11fd0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74   /* The pager st
11fe0 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67  ate may be chang
11ff0 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52  ed from PAGER_ER
12000 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ROR to PAGER_OPE
12010 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69  N here.    ** wi
12020 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74  thout clearing t
12030 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  he error code. T
12040 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e  his is intention
12050 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20  al - the error. 
12060 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c     ** code is cl
12070 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61  eared and the ca
12080 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65  che reset in the
12090 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20   block below..  
120a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
120b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
120c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
120d0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
120e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
120f0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12100 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
12110 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
12120 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PEN;.  }..  /* I
12130 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
12140 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
12150 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12160 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
12170 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20  e.  ** trusted. 
12180 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61  Now that there a
12190 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
121a0 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
121b0 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20  the pager,.  ** 
121c0 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f  it can safely mo
121d0 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ve back to PAGER
121e0 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69  _OPEN state. Thi
121f0 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74  s happens in bot
12200 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e  h.  ** normal an
12210 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  d exclusive-lock
12220 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing mode..  */. 
12230 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
12240 43 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Code ){.    asse
12250 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
12260 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
12270 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
12280 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12290 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
122a0 70 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65  pFile;.    pPage
122b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
122c0 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67  R_OPEN;.    pPag
122d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
122e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
122f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12300 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
12310 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
12320 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
12330 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aster = 0;.}../*
12340 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12350 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
12360 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72  ever an IOERR or
12370 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74   FULL error that
12380 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65   requires.** the
12390 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69   pager to transi
123a0 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52  tion into the ER
123b0 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68  ROR state may ah
123c0 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  ve occurred..** 
123d0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
123e0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
123f0 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
12400 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
12410 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  nd .** the error
12420 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
12430 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
12440 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
12450 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75  on. The .** valu
12460 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
12470 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
12480 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
12490 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
124a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
124b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
124c0 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
124d0 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
124e0 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20  of the.** IOERR 
124f0 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70  sub-codes, the p
12500 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20  ager enters the 
12510 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
12520 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
12530 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50  * is stored in P
12540 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68  ager.errCode. Wh
12550 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65  ile the pager re
12560 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52  mains in the ERR
12570 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c  OR state,.** all
12580 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73   major API calls
12590 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69   on the Pager wi
125a0 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
125b0 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43  eturn Pager.errC
125c0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ode..**.** The E
125d0 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63  RROR state indic
125e0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
125f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12600 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
12610 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
12620 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
12630 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
12640 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
12650 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
12660 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12670 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
12680 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
12690 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
126a0 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
126b0 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e  r occurred, then
126c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
126d0 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
126e0 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
126f0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
12700 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
12720 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20  s if.** it were 
12730 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
12740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
12750 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
12760 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
12770 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
12780 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
12790 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
127a0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
127b0 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
127c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
127d0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
127e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
127f0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
12800 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
12810 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
12820 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
12830 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32  R.  );.  if( rc2
12840 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12850 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
12860 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  RR ){.    pPager
12870 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
12880 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12890 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52  te = PAGER_ERROR
128a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
128b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
128c0 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
128d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
128e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
128f0 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
12900 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
12910 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
12920 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
12930 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
12940 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
12950 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
12960 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
12970 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12980 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
12990 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
129a0 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
129b0 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
129c0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
129d0 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
129e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
129f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12a00 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
12a10 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
12a20 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
12a30 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
12a40 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
12a50 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
12a60 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
12a70 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
12a80 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
12a90 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
12aa0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
12ab0 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
12ac0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
12ad0 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
12ae0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
12af0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
12b00 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
12b10 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
12b20 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
12b30 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
12b40 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
12b50 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
12b60 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
12b70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
12b80 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
12b90 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
12ba0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
12bb0 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
12bc0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
12bd0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
12be0 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
12bf0 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
12c00 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
12c10 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
12c20 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12c30 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12c40 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
12c50 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
12c60 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
12c70 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
12c80 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
12c90 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
12ca0 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
12cb0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
12cc0 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
12cd0 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
12ce0 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
12cf0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
12d00 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12d10 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
12d20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
12d30 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
12d40 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
12d50 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
12d60 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
12d70 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
12d80 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
12d90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12da0 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
12db0 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
12dc0 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
12dd0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
12de0 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
12df0 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
12e00 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
12e10 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
12e20 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
12e30 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
12e40 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
12e50 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
12e60 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
12e70 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
12e80 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
12e90 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
12ea0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
12eb0 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
12ec0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
12ed0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
12ee0 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
12ef0 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
12f00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12f10 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
12f20 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
12f30 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
12f40 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
12f50 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12f60 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
12f70 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
12f80 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
12f90 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
12fa0 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
12fb0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
12fc0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
12fd0 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
12fe0 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
12ff0 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
13000 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
13010 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13020 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
13030 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
13040 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
13050 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
13060 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
13070 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
13080 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
13090 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
130a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
130b0 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
130c0 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
130d0 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
130e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
130f0 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
13100 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
13110 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
13120 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
13130 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
13140 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
13150 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
13160 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
13170 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
13180 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
13190 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
131a0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
131b0 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
131c0 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
131d0 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
131e0 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
131f0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
13200 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
13210 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
13220 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
13230 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
13240 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
13250 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
13260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13270 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
13280 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
13290 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
132a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
132b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
132c0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
132d0 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
132e0 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
132f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
13300 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13310 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13320 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
13330 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
13340 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13350 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
13360 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
13370 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
13380 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
13390 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
133a0 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
133b0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
133c0 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
133d0 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
133e0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
133f0 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
13400 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
13410 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
13420 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
13430 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
13440 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13450 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
13460 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
13470 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
13480 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
13490 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
134a0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
134b0 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
134c0 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
134d0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
134e0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
134f0 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
13500 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
13510 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
13520 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
13530 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
13540 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13550 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
13560 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
13570 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13580 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
13590 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
135a0 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
135b0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
135c0 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
135d0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
135e0 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
135f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
13600 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
13610 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
13620 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
13630 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
13640 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13650 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
13660 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
13670 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
13680 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
136a0 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
136b0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
136c0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
136d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
136e0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
136f0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
13700 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
13710 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13720 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
13730 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
13740 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13750 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13760 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
13770 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
13780 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
13790 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
137a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137b0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
137c0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
137d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
137e0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
137f0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
13800 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13810 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13820 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
13830 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
13840 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13850 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
13860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13870 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13880 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13890 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
138a0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
138b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
138c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
138d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
138e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
138f0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13900 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13910 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13920 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13930 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13940 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
13950 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
13960 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
13970 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
13980 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
13990 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
139a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
139b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
139c0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
139d0 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
139e0 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
139f0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13a00 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
13a10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
13a20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
13a30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13a40 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
13a50 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
13a60 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
13a70 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
13a80 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
13a90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
13aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13ab0 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
13ac0 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
13ad0 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
13ae0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13af0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13b00 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13b10 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
13b20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
13b30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13b40 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13b50 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
13b60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
13b70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13b80 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13b90 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
13ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13bb0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13bc0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  d);.      if( !p
13bd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
13be0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13bf0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13c00 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13c10 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13c20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13c30 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13c40 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13c50 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13c60 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13c70 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13c80 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13c90 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13ca0 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13cb0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13cc0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13cd0 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13ce0 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13cf0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13d00 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13d10 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13d20 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13d30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13d50 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13d60 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
13d70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
13d80 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
13d90 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
13da0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
13db0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
13dc0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
13dd0 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
13de0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
13df0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
13e00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
13e10 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
13e20 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
13e30 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
13e40 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
13e50 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
13e60 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
13e70 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
13e80 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
13e90 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
13ea0 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
13eb0 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
13ec0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
13ed0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
13ee0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
13ef0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13f00 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
13f10 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
13f20 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
13f30 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
13f40 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   );.  }.  if( !p
13f50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13f60 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
13f70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13f80 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
13f90 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
13fa0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
13fb0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
13fc0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
13fd0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
13fe0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
13ff0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14000 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14010 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14020 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14030 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14040 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14050 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14060 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14070 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14080 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14090 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
140a0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
140b0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
140c0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
140d0 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
140e0 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
140f0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14100 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14110 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14120 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14130 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14140 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14150 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14160 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14170 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14180 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
141a0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
141b0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
141c0 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
141d0 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
141e0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
141f0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
14200 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
14210 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
14220 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
14230 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14240 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14250 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
14260 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
14270 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
14280 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
14290 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
142a0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
142b0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
142c0 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
142d0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
142e0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
142f0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
14300 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
14310 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
14320 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
14330 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14340 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14350 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14360 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
14370 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
14380 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
14390 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
143a0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
143b0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
143c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
143d0 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
143e0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
143f0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
14400 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14410 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14420 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14430 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14440 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14460 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14480 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14490 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
144a0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
144b0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
144c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
144d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
144e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
144f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14500 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14510 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14520 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14530 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
14540 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
14550 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
14560 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20  Parameter aData 
14570 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
14580 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72  buffer of pPager
14590 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
145a0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d  .** of data. Com
145b0 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
145c0 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64  a checksum based
145d0 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   ont the content
145e0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  s of the .** pag
145f0 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68  e of data and th
14600 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
14610 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of pPager->cksum
14620 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Init..**.** This
14630 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
14640 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72  hecksum. It is r
14650 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
14660 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
14670 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
14680 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  ue (pPager->cksu
14690 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79  mInit) and every
146a0 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f   200th byte.** o
146b0 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c  f the page data,
146c0 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62   starting with b
146d0 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67  yte offset (pPag
146e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30  er->pageSize%200
146f0 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20  )..** Each byte 
14700 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
14710 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67  s an 8-bit unsig
14720 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  ned integer..**.
14730 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  ** Changing the 
14740 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20  formula used to 
14750 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65  compute this che
14760 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e  cksum results in
14770 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69   an.** incompati
14780 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ble journal file
14790 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
147a0 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  f journal corrup
147b0 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
147c0 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
147d0 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
147e0 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f  ely .** scenario
147f0 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
14800 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
14810 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
14820 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a   be changed. .**
14830 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73   It is much less
14840 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
14850 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
14860 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
14870 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
14880 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
14890 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
148a0 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
148b0 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
148c0 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
148d0 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
148e0 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
148f0 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
14900 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
14910 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
14920 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
14930 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
14940 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
14950 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14960 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ;         /* Che
14970 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72  cksum value to r
14980 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
14990 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
149a0 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20  ize-200;        
149b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
149c0 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e  r */.  while( i>
149d0 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
149e0 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
149f0 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
14a00 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
14a10 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68  ./*.** Report th
14a20 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73  e current page s
14a30 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ize and number o
14a40 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
14a50 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20   back.** to the 
14a60 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66  codec..*/.#ifdef
14a70 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
14a80 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  C.static void pa
14a90 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61  gerReportSize(Pa
14aa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14ab0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
14ac0 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20  ecSizeChng ){.  
14ad0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
14ae0 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d  SizeChng(pPager-
14af0 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d  >pCodec, pPager-
14b00 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65        (int)pPage
14b30 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  r->nReserve);.  
14b40 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
14b50 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  ne pagerReportSi
14b60 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d  ze(X)     /* No-
14b70 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  op if we do not 
14b80 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20  support a codec 
14b90 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
14ba0 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
14bb0 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
14bc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14bd0 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
14be0 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
14bf0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
14c00 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
14c10 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
14c20 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
14c30 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
14c40 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
14c50 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
14c60 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
14c70 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
14c80 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
14c90 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
14ca0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
14cb0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  **.** The main r
14cc0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
14cd0 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d  uses checksums -
14ce0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
14cf0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20  ournal does .** 
14d00 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
14d10 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
14d20 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
14d30 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14d40 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14d50 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
14d60 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
14d70 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
14d80 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
14d90 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
14da0 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
14db0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
14dc0 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
14dd0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
14de0 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
14df0 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
14e00 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
14e10 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
14e20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
14e30 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
14e40 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
14e50 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
14e60 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
14e70 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
14e80 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
14e90 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
14ea0 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
14eb0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
14ec0 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
14ed0 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
14ee0 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
14ef0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
14f00 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
14f10 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
14f20 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
14f30 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
14f40 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
14f50 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
14f60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
14f70 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
14f80 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
14f90 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
14fa0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
14fb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
14fc0 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
14fd0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14fe0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
14ff0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
15000 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
15010 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
15020 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
15030 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15040 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
15050 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
15060 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
15070 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
15080 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
15090 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
150a0 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
150b0 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
150c0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
150d0 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
150e0 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
150f0 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
15100 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
15110 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
15120 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
15130 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
15140 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
15150 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
15160 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
15170 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
15180 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
15190 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
151a0 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
151b0 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
151c0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
151d0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
151e0 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
151f0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
15200 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
15210 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
15220 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
15230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
15240 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
15250 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
15260 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
15270 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
15280 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
15290 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
152a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
152b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
152c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
152d0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
152e0 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
152f0 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
15300 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
15310 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
15320 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
15330 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
15340 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
15350 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
15360 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
15370 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
15380 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
15390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
153a0 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
153b0 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
153c0 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
153d0 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
153e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
153f0 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
15400 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
15410 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
15420 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
15430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15440 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
15450 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
15460 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
15490 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
154a0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
154b0 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
154c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
154d0 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
154e0 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
154f0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
15500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15510 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
15520 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
15530 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
15540 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
15550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
15560 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
15570 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
15580 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
15590 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
155a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
155b0 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
155c0 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
155d0 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
155e0 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
155f0 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
15600 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
15610 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
15620 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
15630 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
15640 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15650 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
15660 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
15670 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
15680 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
15690 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
156a0 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
156b0 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
156c0 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
156d0 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
156e0 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
156f0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
15700 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
15710 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
15720 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
15730 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
15740 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
15750 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
15760 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
15770 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
15780 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
15790 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65  ) );..  /* Eithe
157a0 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67  r the state is g
157b0 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45  reater than PAGE
157c0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
157d0 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  D (a transaction
157e0 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f   .  ** or savepo
157f0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e  int rollback don
15800 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74  e at the request
15810 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20   of the caller) 
15820 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20  or this is.  ** 
15830 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15840 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73  llback. If it is
15850 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
15860 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67  ollback, the pag
15870 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74  er.  ** is in st
15880 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c  ate OPEN and hol
15890 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ds an EXCLUSIVE 
158a0 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61  lock. Hot-journa
158b0 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  l rollback.  ** 
158c0 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20  only reads from 
158d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
158e0 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f  , not the sub-jo
158f0 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
15900 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15910 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15920 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
15930 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
15940 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
15950 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  N && pPager->eLo
15960 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15970 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  CK).  );.  asser
15980 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15990 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
159a0 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61  CACHEMOD || isMa
159b0 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20  inJrnl );..  /* 
159c0 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
159d0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61  mber and page da
159e0 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ta from the jour
159f0 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
15a00 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65  al.  ** file. Re
15a10 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
15a20 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
15a30 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
15a40 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a  occurs..  */.  j
15a50 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
15a60 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
15a70 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20  pPager->sjfd;.  
15a80 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
15a90 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26  jfd, *pOffset, &
15aa0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
15ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15ac0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
15ad0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
15ae0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
15af0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
15b00 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
15b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15b30 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
15b40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
15b50 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
15b60 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
15b70 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
15b80 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
15b90 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
15ba0 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
15bb0 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
15bc0 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
15bd0 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
15be0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
15bf0 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
15c00 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
15c10 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
15c20 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
15c30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
15c40 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
15c50 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
15c60 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
15c70 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
15c80 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
15c90 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
15ca0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
15cb0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
15cc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15cd0 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
15ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15cf0 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
15d00 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
15d10 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
15d20 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
15d30 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
15d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15d50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
15d60 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
15d70 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
15d80 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
15d90 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
15da0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15db0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
15dc0 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
15dd0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
15de0 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75  u8*)aData)!=cksu
15df0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
15e00 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
15e10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15e20 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20  f this page has 
15e30 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
15e40 79 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75  yed by before du
15e50 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
15e60 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
15e70 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
15e80 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
15e90 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
15ea0 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
15eb0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
15ec0 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
15ed0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
15ee0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15ef0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
15f00 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
15f10 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
15f20 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
15f30 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
15f40 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
15f50 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
15f60 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
15f70 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15f80 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
15f90 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
15fa0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
15fb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15fc0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
15fd0 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
15fe0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
15ff0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
16000 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
16010 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
16020 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
16030 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
16040 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
16050 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
16060 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
16070 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
16080 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
16090 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
160a0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
160b0 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
160c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
160d0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
160e0 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
160f0 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
16100 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16110 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
16120 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
16130 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
16140 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
16150 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
16160 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
16170 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
16180 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
16190 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
161a0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
161b0 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
161c0 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
161d0 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
161e0 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
161f0 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
16200 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
16210 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
16220 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
16230 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
16240 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
16250 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
16260 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
16270 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
16280 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
16290 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
162a0 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
162b0 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
162c0 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
162d0 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
162e0 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
162f0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
16300 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
16310 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
16320 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
16330 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
16340 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16350 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
16360 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
16370 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
16380 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
16390 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
163a0 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
163b0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
163c0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
163d0 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
163e0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
163f0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
16400 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
16410 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
16420 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
16430 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
16440 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
16450 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
16460 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
16470 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
16480 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
16490 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
164a0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
164b0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
164c0 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
164d0 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
164e0 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
164f0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
16500 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
16510 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
16520 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
16530 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
16540 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
16550 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
16560 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
16570 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
16580 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
16590 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
165a0 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
165b0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
165c0 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
165d0 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
165e0 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
165f0 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
16600 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
16610 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16620 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
16630 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
16640 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
16650 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
16660 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
16670 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
16680 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
16690 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
166a0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
166b0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
166c0 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
166d0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
166e0 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
166f0 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
16700 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
16710 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
16720 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
16730 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
16740 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
16750 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
16760 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
16770 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
16780 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
16790 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
167a0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
167b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
167c0 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
167d0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
167e0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
167f0 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
16800 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
16810 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
16820 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
16830 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
16840 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
16850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16860 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
16870 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
16880 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
16890 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
168a0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
168b0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
168c0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
168d0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
168e0 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
168f0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
16900 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
16910 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
16920 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
16930 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
16940 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
16950 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
16960 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
16970 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
16980 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
16990 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
169a0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
169b0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
169c0 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
169d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
169e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
169f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
16a00 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
16a10 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
16a20 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
16a30 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
16a40 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
16a50 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
16a60 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
16a70 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
16a80 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
16a90 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
16aa0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
16ab0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
16ac0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
16ad0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16ae0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
16af0 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
16b00 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
16b10 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
16b20 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16b30 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
16b40 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
16b50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
16b60 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16b70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
16b80 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
16b90 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
16ba0 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
16bb0 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
16bc0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
16bd0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
16be0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
16bf0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
16c00 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
16c10 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
16c20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
16c30 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
16c40 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
16c50 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
16c60 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
16c70 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
16c80 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
16c90 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
16ca0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
16cb0 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
16cc0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
16cd0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
16ce0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
16cf0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
16d00 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
16d10 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
16d20 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
16d30 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
16d40 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
16d50 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
16d60 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
16d70 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
16d80 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
16d90 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
16da0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
16db0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16dc0 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
16dd0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
16de0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
16df0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
16e00 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
16e10 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
16e20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
16e30 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
16e40 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
16e50 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
16e60 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
16e70 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16e80 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16e90 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
16ea0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
16eb0 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
16ec0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
16ed0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
16ee0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
16ef0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
16f00 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
16f10 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
16f20 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
16f30 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
16f40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16f50 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
16f60 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
16f70 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
16f80 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
16f90 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
16fa0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
16fb0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
16fc0 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
16fd0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
16fe0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
16ff0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
17000 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
17010 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
17020 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
17030 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17040 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
17050 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17060 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17070 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17080 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17090 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
170a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
170b0 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
170c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
170d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
170e0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
170f0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
17100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
17110 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
17120 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17130 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17140 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17150 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
17160 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17170 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17180 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17190 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
171a0 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
171b0 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
171c0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
171d0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
171e0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
171f0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
17200 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
17210 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
17220 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17230 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17240 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17250 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
17260 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17270 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17280 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17290 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
172a0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
172b0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
172c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
172d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
172e0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
172f0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
17300 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
17310 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
17320 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17330 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17340 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17350 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17360 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17370 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17380 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17390 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
173a0 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
173b0 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
173c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
173d0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
173e0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
173f0 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
17400 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
17410 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
17420 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17430 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17440 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17450 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17460 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17470 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17480 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17490 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
174a0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
174b0 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
174c0 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
174d0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
174e0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
174f0 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
17500 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
17510 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
17520 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17530 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17540 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17550 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17560 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17570 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17580 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17590 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
175a0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
175b0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
175c0 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
175d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
175e0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
175f0 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17600 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17610 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17620 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17630 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17640 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17650 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17660 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17670 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17680 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17690 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
176a0 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
176b0 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
176c0 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
176d0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
176e0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
176f0 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17700 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17710 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17720 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17740 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17750 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17760 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17770 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17780 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17790 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
177a0 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
177b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
177c0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
177d0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
177e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
177f0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17800 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17810 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17820 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17830 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17840 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17850 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17860 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
17870 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
17880 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
17890 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
178a0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
178b0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
178c0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
178d0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
178e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
178f0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17900 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17910 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17920 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17930 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17940 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17950 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
17960 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
17970 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
17980 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
17990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
179a0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
179b0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
179c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
179d0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
179e0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
179f0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17a00 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17a10 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17a20 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17a30 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17a40 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17a50 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
17a60 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
17a70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
17a80 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
17a90 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
17aa0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
17ab0 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17ac0 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17ad0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17ae0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17af0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17b00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17b10 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17b20 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17b30 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
17b40 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
17b50 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
17b60 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
17b70 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
17b80 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
17b90 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
17ba0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
17bb0 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
17bc0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
17bd0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
17be0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
17bf0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
17c00 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
17c10 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
17c20 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
17c30 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
17c40 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
17c50 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
17c60 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
17c70 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
17c80 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
17c90 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
17ca0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
17cb0 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
17cc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
17cd0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
17ce0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
17cf0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
17d00 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
17d10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
17d20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17d30 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
17d40 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
17d50 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
17d60 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
17d70 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
17d80 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
17d90 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
17da0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
17db0 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
17dc0 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
17dd0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
17de0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
17df0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
17e00 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
17e10 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
17e20 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17e30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
17e40 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
17e50 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
17e60 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
17e70 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
17e80 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
17e90 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
17ea0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
17eb0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
17ec0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
17ed0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
17ee0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
17ef0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
17f00 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
17f10 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
17f20 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
17f30 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
17f40 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
17f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
17f60 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
17f70 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
17f80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
17f90 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
17fa0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
17fb0 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
17fc0 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
17fd0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
17fe0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
17ff0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
18000 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
18010 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
18020 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18030 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18040 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18050 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
18060 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18070 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18080 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18090 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
180a0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
180b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
180c0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
180d0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
180e0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
180f0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
18100 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
18110 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
18120 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18130 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18140 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18160 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18170 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18180 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18190 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
181a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
181b0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
181c0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
181d0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
181e0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
181f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
18210 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
18220 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18230 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18240 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18250 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
18260 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18270 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18280 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18290 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
182a0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
182b0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
182c0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
182d0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
182e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
182f0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
18300 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
18310 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18320 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18330 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18340 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18350 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18360 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18370 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18380 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18390 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
183a0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
183b0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
183c0 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
183d0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
183e0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
183f0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
18400 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
18410 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
18420 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18430 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18440 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18450 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18460 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18470 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18480 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18490 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
184a0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
184b0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
184c0 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
184d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
184e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
184f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
18500 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18510 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18520 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18530 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18540 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18550 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
18560 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
18570 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
18580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18590 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
185a0 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
185b0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
185c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
185d0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
185e0 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
185f0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18600 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18610 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18620 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18630 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18640 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18650 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
18660 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
18670 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
18680 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18690 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
186a0 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
186b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
186c0 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
186d0 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
186e0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
186f0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18700 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18710 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18720 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18730 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18740 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18750 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
18760 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
18770 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
18780 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
18790 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
187a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
187b0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
187c0 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
187d0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
187e0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
187f0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18800 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18810 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18820 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18830 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18840 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18850 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18860 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
18870 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18880 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
18890 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
188a0 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
188b0 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
188c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
188d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
188e0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
188f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18900 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18910 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18920 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18930 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
18940 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18950 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
18960 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18970 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
18980 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
18990 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
189a0 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
189b0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
189c0 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
189d0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
189e0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
189f0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
18a00 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
18a10 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
18a20 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
18a30 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
18a40 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18a50 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
18a60 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
18a70 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18a80 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18a90 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18aa0 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
18ab0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18ac0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18ad0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b00 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18b10 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18b20 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
18b30 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
18b40 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
18b50 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
18b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
18b70 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
18b80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18b90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18ba0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18bb0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18bc0 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
18bd0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
18be0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
18bf0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
18c00 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
18c10 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
18c20 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
18c30 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
18c40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18c50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
18c60 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18c80 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
18c90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18ca0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
18cb0 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
18cc0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
18cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
18ce0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
18cf0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
18d00 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
18d10 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
18d20 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
18d30 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
18d40 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
18d50 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
18d60 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
18d70 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
18d80 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
18d90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18da0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
18db0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
18dc0 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
18dd0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
18de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
18df0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
18e00 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
18e10 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
18e20 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
18e30 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
18e40 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
18e50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
18e60 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
18e70 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
18e80 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
18e90 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
18ea0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
18eb0 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
18ec0 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
18ed0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
18ee0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
18ef0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18f00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
18f10 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
18f20 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
18f30 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
18f40 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
18f50 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
18f60 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
18f70 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
18f80 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
18f90 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
18fa0 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
18fb0 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
18fc0 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
18fd0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
18fe0 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
18ff0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
19000 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
19010 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
19020 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19030 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19040 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19050 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19060 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
19070 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
19080 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
19090 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
190a0 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
190b0 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
190c0 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
190d0 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
190e0 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
190f0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
19100 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
19110 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
19120 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19140 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19150 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19160 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19170 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19180 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19190 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
191a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
191b0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
191c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
191d0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
191e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
191f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19200 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19210 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
19220 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19230 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19240 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19250 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19260 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19270 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19280 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19290 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
192a0 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
192b0 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
192c0 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
192d0 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
192e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
192f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19300 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
19310 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
19320 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19330 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19340 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19350 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19360 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19370 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19380 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19390 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
193a0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
193b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
193c0 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
193d0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
193e0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
193f0 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19400 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19410 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19420 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19430 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19440 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19450 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19460 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19470 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19480 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19490 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
194a0 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
194b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
194c0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
194d0 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
194e0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
194f0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19500 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
19510 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19520 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19530 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19540 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19550 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19580 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19590 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
195a0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
195b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
195c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
195d0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
195e0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
195f0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
19600 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
19610 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
19620 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19630 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
19640 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
19650 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
19660 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
19670 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
19680 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f  used used .** to
19690 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
196a0 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
196b0 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
196c0 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
196d0 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
196e0 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
196f0 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
19700 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
19710 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
19720 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
19730 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
19740 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
19750 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
19760 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
19770 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
19780 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
19790 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
197a0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
197b0 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
197c0 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
197d0 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
197e0 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
197f0 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
19800 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
19810 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
19820 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
19830 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a  ECTOR_SIZE..**.*
19840 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
19850 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  s the SQLITE_IOC
19860 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
19870 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c  RWRITE property,
19880 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65   then set.** the
19890 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
198a0 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69  r size to its mi
198b0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32  nimum value (512
198c0 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  ).  The purpose 
198d0 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65  of.** pPager->se
198e0 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64  ctorSize is to d
198f0 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74  efine the "blast
19900 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65   radius" of byte
19910 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  s that.** might 
19920 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73  change if a cras
19930 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77  h occurs while w
19940 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67  riting to a sing
19950 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68  le byte in.** th
19960 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77  at range.  But w
19970 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ith POWERSAFE_OV
19980 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61  ERWRITE, the bla
19990 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72  st radius is zer
199a0 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68  o.** (that is wh
199b0 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  at POWERSAFE_OVE
199c0 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73  RWRITE means), s
199d0 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  o we minimize th
199e0 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65  e sector.** size
199f0 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  .  For backwards
19a00 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f   compatibility o
19a10 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
19a20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
19a30 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74  at,.** we cannot
19a40 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
19a50 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
19a60 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a  e below 512..*/.
19a70 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
19a80 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
19a90 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
19aa0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
19ab0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
19ac0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
19ad0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
19ae0 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c  pFile.   || (sql
19af0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
19b00 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
19b10 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20  er->fd) & .     
19b20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19b30 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
19b40 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20  OVERWRITE)!=0.  
19b50 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
19b60 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
19b70 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
19b80 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
19b90 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
19ba0 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
19bb0 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
19bc0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
19bd0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
19be0 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
19bf0 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20  segfault. */.   
19c00 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
19c10 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  ize = 512;.  }el
19c20 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
19c30 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
19c40 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
19c50 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
19c60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
19c70 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
19c80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63       pPager->sec
19c90 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
19ca0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
19cb0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
19cc0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
19cd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19ce0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19cf0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 20 20 70  >=512 );.      p
19d00 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
19d10 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  e = MAX_SECTOR_S
19d20 49 5a 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  IZE;.    }.  }.}
19d30 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
19d40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
19d50 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
19d60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19d70 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
19d80 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
19d90 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
19da0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
19db0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
19dc0 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
19dd0 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
19de0 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
19df0 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
19e00 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
19e10 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
19e20 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19e30 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19e40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
19e50 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
19e60 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
19e70 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
19e80 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
19e90 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
19ea0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
19eb0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
19ec0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
19ed0 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
19ee0 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
19ef0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19f00 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
19f10 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
19f20 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
19f30 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
19f40 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
19f50 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19f60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19f70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
19f80 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
19f90 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
19fa0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
19fb0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
19fc0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19fd0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
19fe0 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
19ff0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1a000 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1a010 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1a020 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1a030 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a040 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1a050 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1a060 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1a070 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1a080 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1a090 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1a0a0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1a0b0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1a0c0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1a0d0 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1a0e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1a0f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a100 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1a110 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1a120 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1a130 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1a140 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1a150 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1a160 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1a170 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1a180 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1a190 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1a1a0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1a1b0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1a1c0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1a1d0 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1a1e0 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1a1f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1a200 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1a210 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1a220 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1a230 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1a240 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1a250 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1a260 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a270 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1a280 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1a290 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1a2a0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1a2b0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1a2c0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1a2d0 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1a2e0 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1a2f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a300 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1a310 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1a320 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1a330 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1a340 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1a350 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1a360 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1a370 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1a380 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1a390 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1a3a0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1a3b0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1a3c0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1a3d0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1a3e0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1a3f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1a400 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1a410 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1a420 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1a430 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1a440 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1a450 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1a460 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1a470 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1a480 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1a490 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1a4a0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1a4b0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1a4c0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1a4d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1a4e0 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1a4f0 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1a500 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1a510 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1a520 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1a530 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1a540 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1a550 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1a560 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1a570 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1a580 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1a590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1a5a0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1a5b0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1a5c0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1a5d0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1a5e0 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1a5f0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1a600 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1a610 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a620 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1a630 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1a640 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1a650 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1a660 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1a670 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1a680 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1a690 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1a6a0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1a6b0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1a6c0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1a6d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1a6e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a6f0 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1a700 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1a710 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1a720 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1a730 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1a740 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1a750 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1a760 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1a770 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1a780 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1a790 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1a7a0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1a7b0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1a7c0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1a7d0 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1a7e0 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1a7f0 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1a800 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1a810 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1a820 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1a830 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1a840 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1a850 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1a860 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1a870 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1a880 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1a890 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a8a0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1a8b0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1a8e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1a8f0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1a900 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1a910 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a920 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1a930 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1a940 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1a950 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1a960 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1a970 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1a980 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1a990 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1a9a0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1a9b0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9d0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1a9e0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1a9f0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa10 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1aa20 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1aa30 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1aa40 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1aa50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1aa60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1aa70 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1aa80 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1aa90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1aaa0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1aab0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1aac0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
1aad0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1aae0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1aaf0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1ab00 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1ab10 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1ab20 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1ab30 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1ab40 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1ab50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1ab60 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1ab70 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1ab80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ab90 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1aba0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1abb0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1abc0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1abd0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1abe0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1abf0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1ac00 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1ac10 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1ac20 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1ac30 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1ac40 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1ac50 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1ac60 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1ac70 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1ac80 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1ac90 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1aca0 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1acb0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1acc0 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1acd0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1ace0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1acf0 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1ad00 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1ad10 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1ad20 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1ad30 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1ad40 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1ad50 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1ad60 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1ad70 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1ad80 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1ad90 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1ada0 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1adb0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1adc0 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1add0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1ade0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1adf0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1ae00 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1ae10 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1ae20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1ae30 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1ae40 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1ae50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1ae60 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1ae70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1ae80 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1ae90 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1aea0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1aeb0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1aec0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1aed0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1aee0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1aef0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1af00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1af10 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1af20 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1af30 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1af40 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1af50 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1af60 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1af70 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1af80 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1af90 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1afa0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1afb0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1afc0 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1afd0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1afe0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1aff0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b010 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b020 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b030 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b050 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b060 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b070 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b080 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b090 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b0a0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b0b0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b0c0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b0d0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b0e0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b0f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b100 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b110 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b120 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b130 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b150 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b160 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b170 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b180 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1b190 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b1a0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1b1b0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1b1c0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1b1d0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1b1e0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1b1f0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1b200 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1b210 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1b220 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1b230 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1b240 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1b250 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1b260 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1b270 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1b280 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1b290 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1b2a0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1b2b0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1b2c0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1b2d0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1b2e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b2f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b300 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b310 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1b320 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1b330 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1b340 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1b350 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b360 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b370 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1b380 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1b390 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1b3a0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1b3b0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b3c0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b3d0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b3e0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b3f0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b400 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b410 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b420 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1b430 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1b440 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1b450 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1b460 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1b470 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1b480 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1b490 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1b4a0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1b4b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1b4c0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1b4d0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1b4e0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1b4f0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1b500 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1b510 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1b520 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1b530 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1b540 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1b550 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1b560 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1b570 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1b580 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1b590 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1b5a0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1b5b0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1b5c0 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1b5d0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1b5e0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1b5f0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b600 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1b610 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1b620 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1b630 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b640 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1b650 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1b660 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1b670 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1b680 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1b690 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1b6a0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1b6b0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1b6c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b6d0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1b6e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1b6f0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1b700 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1b710 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1b720 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b730 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1b740 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1b750 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b760 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1b770 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1b780 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b790 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1b7a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1b7b0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1b7c0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1b7d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1b7e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1b7f0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1b800 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1b810 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1b820 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1b830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b850 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b860 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1b870 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1b880 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1b890 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1b8a0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1b8b0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1b8c0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1b8d0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1b8e0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1b8f0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1b900 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1b910 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1b920 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1b930 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1b940 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1b950 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b960 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b970 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b980 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1b990 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1b9a0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1b9b0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1b9c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b9d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b9e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b9f0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1ba00 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1ba10 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1ba20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1ba30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1ba40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1ba50 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1ba60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ba70 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1ba80 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1ba90 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1baa0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1bab0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1bac0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1bad0 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1bae0 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1baf0 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1bb00 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1bb10 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1bb20 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1bb30 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1bb40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1bb50 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1bb60 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1bb70 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1bb80 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1bb90 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1bba0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1bbb0 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1bbc0 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1bbd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1bbe0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1bbf0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1bc00 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1bc10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1bc20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1bc30 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1bc40 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1bc50 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1bc60 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1bc70 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1bc80 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1bc90 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1bca0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1bcb0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1bcc0 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1bcd0 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1bce0 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1bcf0 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1bd00 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1bd10 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1bd20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1bd30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1bd40 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1bd50 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1bd60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1bd70 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1bd80 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1bd90 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1bda0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1bdb0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1bdc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bdd0 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1bde0 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1bdf0 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1be00 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1be10 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1be20 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1be30 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1be40 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1be50 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1be60 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1be70 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1be80 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1be90 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1bea0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1beb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1bec0 42 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72  BUG.  if( pPager
1bed0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1bee0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  {.    sqlite3OsF
1bef0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
1bf00 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
1bf10 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1bf20 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  GED,0);.  }.#end
1bf30 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  if..  /* If this
1bf40 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
1bf50 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
1bf60 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
1bf70 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
1bf80 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
1bf90 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
1bfa0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
1bfb0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
1bfc0 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
1bfd0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
1bfe0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
1bff0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
1c000 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
1c010 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
1c020 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
1c030 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
1c040 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
1c050 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
1c060 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
1c070 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
1c080 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
1c090 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
1c0a0 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
1c0b0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
1c0c0 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
1c0d0 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
1c0e0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
1c0f0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
1c100 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
1c110 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
1c120 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1c130 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
1c140 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
1c150 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
1c160 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
1c170 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
1c180 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
1c190 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
1c1a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
1c1b0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1c1c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
1c1d0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1c1e0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
1c1f0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1c200 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1c210 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1c220 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1c230 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
1c240 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c250 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1c260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
1c270 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1c280 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1c290 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1c2a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1c2b0 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20  R_OPEN).  ){.   
1c2c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c2d0 65 72 53 79 6e 63 28 70 50 61 67 65 72 29 3b 0a  erSync(pPager);.
1c2e0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c2f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c300 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1c310 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1c320 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1c330 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0');.    testcas
1c340 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1c350 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1c360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1c370 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
1c380 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1c390 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
1c3a0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
1c3b0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1c3c0 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
1c3d0 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
1c3e0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
1c3f0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1c400 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
1c410 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1c420 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
1c430 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1c440 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1c450 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
1c460 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
1c470 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1c480 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
1c490 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
1c4a0 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
1c4b0 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
1c4c0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1c4d0 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
1c4e0 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
1c4f0 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
1c500 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
1c510 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
1c520 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
1c530 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
1c540 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1c550 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1c560 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
1c570 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
1c580 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c590 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
1c5a0 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
1c5b0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
1c5c0 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
1c5d0 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1c5e0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
1c5f0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1c600 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1c610 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
1c620 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
1c630 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
1c640 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
1c650 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
1c660 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
1c670 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1c680 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
1c690 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1c6a0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
1c6b0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1c6c0 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
1c6d0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
1c6e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1c6f0 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1c700 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
1c710 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1c720 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1c730 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63  ; /* Pager objec
1c740 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1c750 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20  h page pPg */.  
1c760 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
1c770 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  >pgno;       /* 
1c780 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72  Page number to r
1c790 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ead */.  int rc 
1c7a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1c7b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1c7c0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
1c7d0 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  InWal = 0;      
1c7e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c7f0 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67  f page is in log
1c800 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70   file */.  int p
1c810 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  gsz = pPager->pa
1c820 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65  geSize; /* Numbe
1c830 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
1c840 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
1c850 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1c860 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
1c870 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1c880 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1c890 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66  er->fd) );..  if
1c8a0 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28  ( NEVER(!isOpen(
1c8b0 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a  pPager->fd)) ){.
1c8c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c8d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1c8e0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
1c8f0 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
1c900 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c920 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  K;.  }..  if( pa
1c930 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1c940 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20  ) ){.    /* Try 
1c950 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65  to pull the page
1c960 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d   from the write-
1c970 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20  ahead log. */.  
1c980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1c990 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57  lRead(pPager->pW
1c9a0 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57  al, pgno, &isInW
1c9b0 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  al, pgsz, pPg->p
1c9c0 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Data);.  }.  if(
1c9d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c9e0 26 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20  & !isInWal ){.  
1c9f0 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
1ca00 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1ca10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1ca20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ca30 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1ca40 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1ca50 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  gsz, iOffset);. 
1ca60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ca70 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1ca80 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
1ca90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1caa0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
1cab0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1cac0 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1cad0 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1cae0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1caf0 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1cb00 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1cb10 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1cb20 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1cb30 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1cb40 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1cb50 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1cb60 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1cb70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cb80 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1cb90 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1cba0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1cbb0 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1cbc0 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1cbd0 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1cbe0 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1cbf0 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1cc00 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1cc10 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1cc20 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1cc30 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1cc40 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1cc50 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1cc60 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1cc70 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1cc80 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1cc90 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1cca0 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1ccb0 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1ccc0 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1ccd0 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1cce0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1ccf0 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1cd00 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1cd10 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1cd20 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
1cd30 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1cd40 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1cd50 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1cd60 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1cd70 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1cd80 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1cd90 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1cda0 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1cdb0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1cdc0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1cdd0 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1cde0 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1cdf0 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1ce00 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1ce10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1ce20 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1ce30 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1ce40 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1ce50 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1ce60 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1ce70 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1ce80 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
1ce90 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1cea0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1ceb0 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1cec0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1ced0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1cee0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1cef0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1cf00 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1cf10 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1cf20 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1cf30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1cf40 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1cf50 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1cf60 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1cf70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cf80 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1cf90 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1cfa0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1cfb0 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1cfc0 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1cfd0 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1cfe0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1cff0 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1d000 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1d010 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1d020 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1d030 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1d040 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1d050 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1d060 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1d070 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d080 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1d090 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1d0a0 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1d0b0 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1d0c0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1d0d0 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1d0e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1d0f0 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1d100 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1d110 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1d120 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1d130 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1d140 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1d150 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1d160 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1d170 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1d180 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1d190 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1d1a0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1d1b0 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1d1c0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d1d0 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1d1e0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1d1f0 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1d200 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1d210 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1d220 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1d230 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1d240 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1d250 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1d260 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1d270 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1d280 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1d290 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1d2a0 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1d2b0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1d2c0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1d2d0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1d2e0 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1d2f0 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1d300 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d310 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1d320 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1d330 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1d340 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1d350 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1d360 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1d370 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1d380 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1d390 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1d3a0 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1d3b0 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1d3c0 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1d3d0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1d3e0 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1d3f0 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1d400 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1d410 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1d420 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1d430 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1d440 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1d450 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1d460 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1d470 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1d480 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1d490 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1d4a0 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1d4b0 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1d4c0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1d4d0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1d4e0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1d4f0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1d500 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1d510 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1d520 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1d530 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1d540 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1d550 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1d560 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1d570 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d580 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1d590 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1d5a0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1d5b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1d5c0 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1d5d0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1d5e0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
1d5f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1d600 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1d610 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1d620 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1d630 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1d640 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1d650 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1d660 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1d670 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1d680 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
1d690 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1d6a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1d6c0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1d6d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d6e0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1d6f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d700 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
1d710 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1d720 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
1d730 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
1d740 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
1d750 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
1d760 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
1d770 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1d780 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
1d790 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
1d7a0 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
1d7b0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
1d7c0 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
1d7d0 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
1d7e0 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
1d7f0 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
1d800 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
1d810 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
1d820 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
1d830 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
1d840 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1d850 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
1d860 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
1d870 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
1d880 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
1d890 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
1d8a0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
1d8b0 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
1d8c0 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
1d8d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
1d8e0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
1d8f0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
1d900 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1d910 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1d920 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d930 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
1d940 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
1d950 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
1d960 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1d970 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
1d980 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1d990 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d9b0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
1d9c0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
1d9f0 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
1da00 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
1da10 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
1da20 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
1da30 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1da40 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
1da50 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
1da60 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
1da70 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
1da80 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
1da90 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
1daa0 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
1dab0 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
1dac0 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
1dad0 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
1dae0 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
1daf0 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
1db00 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1db10 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
1db20 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1db30 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1db40 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1db50 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
1db60 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
1db70 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
1db80 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
1db90 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
1dba0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1dbb0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1dbc0 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
1dbd0 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
1dbe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dbf0 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
1dc00 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1dc10 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1dc20 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
1dc30 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
1dc40 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
1dc50 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
1dc60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dc70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1dc80 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
1dc90 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
1dca0 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
1dcb0 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
1dcc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1dcd0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
1dce0 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
1dcf0 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
1dd00 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
1dd10 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
1dd20 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
1dd30 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1dd40 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
1dd50 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
1dd60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20  .**.** The list 
1dd70 6f 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20  of pages passed 
1dd80 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
1dd90 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74  e is always sort
1dda0 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ed by page numbe
1ddb0 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20  r..** Hence, if 
1ddc0 70 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61  page 1 appears a
1ddd0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  nywhere on the l
1dde0 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ist, it will be 
1ddf0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a  the first page..
1de00 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
1de10 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
1de20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de40 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1de50 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1de60 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1de70 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1de80 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
1de90 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
1dea0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1deb0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1dec0 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
1ded0 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1dee0 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1def0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1df00 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1df10 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20   commit */.){.  
1df20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1df50 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20  /.  int nList;  
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1df80 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20   pages in pList 
1df90 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1dfa0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1dfb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1dfc0 48 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67  HECK_PAGES).  Pg
1dfd0 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dff0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1e000 72 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69  r pages */.#endi
1e010 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
1e020 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61  ger->pWal );.  a
1e030 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1e040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e050 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
1e060 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69  that the page li
1e070 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69  st is in accendi
1e080 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f  ng order */.  fo
1e090 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20  r(p=pList; p && 
1e0a0 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e  p->pDirty; p=p->
1e0b0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73  pDirty){.    ass
1e0c0 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70  ert( p->pgno < p
1e0d0 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29  ->pDirty->pgno )
1e0e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1e0f0 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70  assert( pList->p
1e100 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f  Dirty==0 || isCo
1e110 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73  mmit );.  if( is
1e120 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  Commit ){.    /*
1e130 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61   If a WAL transa
1e140 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
1e150 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20  ommitted, there 
1e160 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77  is no point in w
1e170 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  riting.    ** an
1e180 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  y pages with pag
1e190 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
1e1a0 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65  r than nTruncate
1e1b0 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69   into the WAL fi
1e1c0 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20  le..    ** They 
1e1d0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65  will never be re
1e1e0 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  ad by any client
1e1f0 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d  . So remove them
1e200 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79   from the pDirty
1e210 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72  .    ** list her
1e220 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20  e. */.    PgHdr 
1e230 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a  *p;.    PgHdr **
1e240 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b  ppNext = &pList;
1e250 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a  .    nList = 0;.
1e260 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1e270 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 3b 20   (*ppNext = p); 
1e280 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1e290 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1e2a0 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  =nTruncate ){.  
1e2b0 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26        ppNext = &
1e2c0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  p->pDirty;.     
1e2d0 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20     nList++;.    
1e2e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1e2f0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1e300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73   }else{.    nLis
1e310 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 1;.  }.  pPa
1e320 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
1e330 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20  _STAT_WRITE] += 
1e340 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c  nList;..  if( pL
1e350 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1e360 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1e370 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1e380 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1e390 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1e3a0 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1e3b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1e3c0 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1e3d0 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67  , isCommit, pPag
1e3e0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
1e3f0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1e400 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1e410 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
1e420 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1e430 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1e440 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e450 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
1e460 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
1e470 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67  ->pBackup, p->pg
1e480 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61  no, (u8 *)p->pDa
1e490 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1e4a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1e4b0 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73  ECK_PAGES.  pLis
1e4c0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1e4d0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1e4e0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66  r->pPCache);.  f
1e4f0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1e500 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1e510 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
1e520 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  ash(p);.  }.#end
1e530 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
1e540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
1e550 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
1e560 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a  on on the WAL..*
1e570 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e580 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c  e used to be cal
1e590 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e  led "pagerOpenSn
1e5a0 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73  apshot()" becaus
1e5b0 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79  e it essentially
1e5c0 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70  .** makes a snap
1e5d0 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61  shot of the data
1e5e0 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72  base at the curr
1e5f0 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  ent point in tim
1e600 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a  e and preserves.
1e610 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  ** that snapshot
1e620 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
1e630 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20  reader in spite 
1e640 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20  of concurrently 
1e650 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74  changes by.** ot
1e660 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63  her writers or c
1e670 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  heckpointers..*/
1e680 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e690 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
1e6a0 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
1e6b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1e6e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1e6f0 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20  changed = 0;    
1e700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e710 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73  rue if cache mus
1e720 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20  t be reset */.. 
1e730 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1e740 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1e750 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e760 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1e770 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
1e780 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
1e790 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71  ADER );..  /* sq
1e7a0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1e7b0 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73  ransaction() was
1e7c0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20   not called for 
1e7d0 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a  the previous.  *
1e7e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  * transaction in
1e7f0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
1e800 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c  CLUSIVE.  So cal
1e810 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65  l it now.  If we
1e820 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63  .  ** are in loc
1e830 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c  king_mode=NORMAL
1e840 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77   and EndRead() w
1e850 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  as previously ca
1e860 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64  lled,.  ** the d
1e870 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73  uplicate call is
1e880 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
1e890 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
1e8a0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1e8b0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1e8c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1e8d0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1e8e0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1e8f0 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20  l, &changed);.  
1e900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e910 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a  K || changed ){.
1e920 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1e930 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
1e940 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1e950 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1e960 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1e970 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1e980 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f  e transition fro
1e990 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  m PAGER_OPEN.** 
1e9a0 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
1e9b0 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69  state to determi
1e9c0 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ne the size of t
1e9d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e9e0 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73  .** in pages (as
1e9f0 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20  suming the page 
1ea00 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73  size currently s
1ea10 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70  tored in Pager.p
1ea20 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20  ageSize)..**.** 
1ea30 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
1ea40 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
1ea50 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1ea60 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1ea70 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67  tabase.** in pag
1ea80 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
1ea90 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69  *pnPage. Otherwi
1eaa0 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
1eab0 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51  e (perhaps.** SQ
1eac0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1ead0 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
1eae0 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
1eaf0 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
1eb00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1eb10 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1eb20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
1eb30 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
1eb40 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1eb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1eb60 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1eb70 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1eb80 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c  /* Query the WAL
1eb90 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20   sub-system for 
1eba0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1ebb0 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65  e. The WalDbsize
1ebc0 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ().  ** function
1ebd0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   returns zero if
1ebe0 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20   the WAL is not 
1ebf0 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72  open (i.e. Pager
1ec00 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20  .pWal==0), or.  
1ec10 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
1ec20 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  se size is not a
1ec30 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61  vailable. The da
1ec40 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1ec50 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ot.  ** availabl
1ec60 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
1ec70 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65  ub-system if the
1ec80 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70   log file is emp
1ec90 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61  ty or.  ** conta
1eca0 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d  ins no valid com
1ecb0 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
1ecc0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
1ecd0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1ece0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1ecf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1ed00 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1ed10 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67  D_LOCK );.  nPag
1ed20 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62  e = sqlite3WalDb
1ed30 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
1ed40 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  l);..  /* If the
1ed50 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1ed60 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  as not available
1ed70 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1ed80 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64  b-system,.  ** d
1ed90 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65  etermine it base
1eda0 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  d on the size of
1edb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1edc0 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a  le. If the size.
1edd0 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
1ede0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1edf0 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
1ee00 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65  iple of the page
1ee10 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e  -size,.  ** roun
1ee20 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65  d down to the ne
1ee30 61 72 65 73 74 20 70 61 67 65 2e 20 45 78 63 65  arest page. Exce
1ee40 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72  pt, any file lar
1ee50 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20  ger than 0.  ** 
1ee60 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73  bytes in size is
1ee70 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63   considered to c
1ee80 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20  ontain at least 
1ee90 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  one page..  */. 
1eea0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1eeb0 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
1eee0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1eef0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
1ef00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1ef10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1ef20 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1ef30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ef40 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  d) ){.      int 
1ef50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1ef60 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1ef70 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  d, &n);.      if
1ef80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ef90 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1efa0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1efb0 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
1efc0 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
1efd0 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
1efe0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1eff0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1f000 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1f010 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1f020 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
1f030 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
1f040 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
1f050 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
1f060 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
1f070 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
1f080 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
1f090 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
1f0a0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1f0b0 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
1f0c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
1f0d0 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
1f0e0 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
1f0f0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1f100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f110 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1f120 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1f130 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
1f140 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
1f150 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
1f160 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1f170 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
1f180 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
1f190 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1f1a0 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
1f1b0 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
1f1c0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
1f1d0 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
1f1e0 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
1f1f0 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
1f200 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
1f210 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1f220 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
1f230 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
1f240 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
1f250 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
1f260 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1f270 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
1f280 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
1f290 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
1f2a0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1f2b0 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
1f2c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
1f2d0 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
1f2e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
1f2f0 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
1f300 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
1f310 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1f320 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1f330 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
1f340 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1f350 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
1f360 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
1f370 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
1f380 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1f390 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
1f3a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
1f3b0 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
1f3c0 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
1f3d0 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
1f3e0 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
1f3f0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
1f400 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
1f410 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
1f420 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
1f430 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
1f440 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
1f450 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
1f460 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f470 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
1f480 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
1f490 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f4a0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1f4b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1f4c0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
1f4d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f4e0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
1f4f0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
1f500 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1f510 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
1f520 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1f530 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f540 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
1f550 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
1f560 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1f570 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1f580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f590 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
1f5a0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1f5b0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
1f5c0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f5d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
1f5e0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
1f5f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f600 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
1f610 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
1f620 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57  l, 0);.      isW
1f630 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
1f640 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1f650 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
1f660 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1f670 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1f680 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
1f690 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
1f6a0 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
1f6b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1f6c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f6d0 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
1f6e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1f6f0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1f700 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
1f710 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
1f720 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f730 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
1f740 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
1f750 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
1f760 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1f770 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1f780 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
1f790 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1f7a0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
1f7b0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
1f7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f7d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f7e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
1f7f0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
1f800 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
1f810 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
1f820 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
1f830 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
1f840 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
1f850 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
1f860 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
1f870 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
1f880 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
1f890 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
1f8a0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
1f8b0 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
1f8c0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
1f8d0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
1f8e0 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
1f8f0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
1f900 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
1f910 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
1f920 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
1f930 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
1f940 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
1f950 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
1f960 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
1f970 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
1f980 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
1f990 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
1f9a0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
1f9b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
1f9c0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
1f9d0 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
1f9e0 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
1f9f0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
1fa00 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
1fa10 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
1fa20 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
1fa30 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
1fa40 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1fa50 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
1fa60 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
1fa70 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
1fa80 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
1fa90 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
1faa0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
1fab0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
1fac0 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
1fad0 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
1fae0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
1faf0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
1fb00 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
1fb10 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
1fb20 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1fb30 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
1fb40 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1fb50 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
1fb60 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
1fb70 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
1fb80 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
1fb90 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
1fba0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
1fbb0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
1fbc0 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
1fbd0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
1fbe0 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
1fbf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1fc00 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
1fc10 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
1fc20 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
1fc30 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
1fc40 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
1fc50 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
1fc60 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
1fc70 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
1fc80 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
1fc90 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
1fca0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
1fcb0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
1fcc0 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
1fcd0 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
1fce0 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
1fcf0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
1fd00 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
1fd10 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
1fd20 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
1fd30 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
1fd40 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
1fd50 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1fd60 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
1fd70 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
1fd80 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
1fd90 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
1fda0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
1fdb0 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
1fdc0 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
1fdd0 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
1fde0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
1fdf0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
1fe00 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
1fe10 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
1fe20 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
1fe30 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
1fe40 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
1fe50 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
1fe60 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1fe70 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
1fe80 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
1fe90 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
1fea0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
1feb0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
1fec0 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
1fed0 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
1fee0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
1fef0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
1ff00 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
1ff10 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1ff20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
1ff30 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
1ff40 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
1ff50 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
1ff60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
1ff70 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
1ff80 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
1ff90 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
1ffa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ffb0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
1ffc0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
1ffd0 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
1ffe0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
1fff0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
20000 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
20010 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
20020 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20030 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
20040 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20050 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
20060 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
20070 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
20080 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
20090 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
200a0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
200b0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
200c0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
200d0 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
200e0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
200f0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20100 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
20110 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
20120 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
20130 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20140 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
20150 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
20160 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
20170 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
20180 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
20190 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
201a0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
201b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
201c0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
201d0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
201e0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
201f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
20200 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
20210 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
20220 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
20230 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
20240 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20250 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
20260 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
20270 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
20280 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20290 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
202a0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
202b0 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
202c0 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
202d0 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
202e0 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
202f0 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
20300 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20310 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
20320 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
20330 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
20340 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
20350 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20360 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
20370 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
20380 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
20390 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
203a0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
203b0 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
203c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
203d0 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
203e0 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
203f0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20400 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
20410 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
20420 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20430 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
20440 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
20450 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
20460 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
20470 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
20480 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
20490 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
204a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
204b0 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
204c0 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
204d0 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
204e0 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
204f0 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
20500 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
20510 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
20520 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
20530 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
20540 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
20550 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
20560 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20570 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
20580 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
20590 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
205a0 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
205b0 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
205c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
205d0 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
205e0 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
205f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20600 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20610 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
20620 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20630 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20640 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
20650 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
20660 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
20670 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
20680 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
20690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
206a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
206b0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
206c0 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
206d0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
206e0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
206f0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
20700 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
20710 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
20720 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
20730 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
20740 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
20750 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20760 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
20770 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
20780 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
20790 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
207a0 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
207b0 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
207c0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
207d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
207e0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
207f0 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
20800 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
20810 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20820 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
20830 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
20840 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
20850 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
20860 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
20870 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
20880 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
20890 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
208a0 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
208b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
208c0 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
208d0 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
208e0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
208f0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
20900 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
20910 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
20920 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
20930 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
20940 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
20950 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
20960 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
20970 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
20980 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
20990 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
209a0 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
209b0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
209c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
209d0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
209e0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
209f0 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
20a00 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
20a10 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
20a20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
20a30 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
20a40 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
20a50 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
20a60 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
20a70 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
20a80 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
20a90 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
20aa0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
20ab0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
20ac0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
20ad0 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
20ae0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
20af0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20b00 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
20b10 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
20b20 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
20b30 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
20b40 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
20b50 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
20b60 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
20b70 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
20b80 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
20b90 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
20ba0 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
20bb0 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
20bc0 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
20bd0 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
20be0 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
20bf0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
20c00 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
20c10 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
20c20 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
20c30 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
20c40 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20c50 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
20c60 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
20c70 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
20c80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20c90 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
20ca0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20cb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20cc0 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
20cd0 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
20ce0 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
20cf0 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
20d00 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
20d10 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
20d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20d30 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
20d40 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
20d50 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
20d60 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
20d70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
20d80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
20d90 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
20da0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
20db0 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
20dc0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
20dd0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20de0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
20df0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
20e00 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
20e10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20e20 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
20e30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
20e40 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
20e50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
20e60 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
20e70 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
20e80 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
20e90 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
20ea0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
20eb0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
20ec0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
20ed0 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
20ee0 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
20ef0 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
20f00 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
20f10 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
20f20 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
20f30 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
20f40 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
20f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
20f60 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
20f70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
20f80 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
20f90 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
20fa0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
20fb0 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
20fc0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
20fd0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
20fe0 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
20ff0 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
21000 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
21010 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
21020 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
21030 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
21040 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
21050 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
21060 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
21070 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
21080 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
21090 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
210a0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
210b0 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
210c0 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
210d0 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
210e0 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
210f0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
21100 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
21110 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
21120 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
21130 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
21140 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
21150 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
21160 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
21170 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
21180 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
21190 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
211a0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
211b0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
211c0 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
211d0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
211e0 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
211f0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
21200 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
21210 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
21220 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
21230 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
21240 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
21250 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
21260 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
21270 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
21280 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
21290 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
212a0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
212b0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
212c0 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
212d0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
212e0 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
212f0 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
21300 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
21310 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
21320 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
21330 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
21340 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21350 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
21360 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
21370 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
21380 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
21390 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
213a0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
213b0 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
213c0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
213d0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
213e0 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
213f0 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
21400 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
21410 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
21420 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
21430 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
21440 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
21450 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66  * The above is f
21460 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  or a rollback-jo
21470 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72  urnal mode.  For
21480 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63   WAL mode, OFF c
21490 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d  ontinues.** to m
214a0 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63  ean that no sync
214b0 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e  s ever occur.  N
214c0 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ORMAL means that
214d0 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63   the WAL is sync
214e0 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74  ed.** prior to t
214f0 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63  he start of chec
21500 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20  kpoint and that 
21510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21520 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61  e is synced.** a
21530 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
21540 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
21550 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  nt if the entire
21560 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
21570 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74  WAL.** was writt
21580 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
21590 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
215a0 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f  no sync operatio
215b0 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20  ns occur for.** 
215c0 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d  an ordinary comm
215d0 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64  it in NORMAL mod
215e0 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c  e with WAL.  FUL
215f0 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
21600 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20   WAL.** file is 
21610 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
21620 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65   each commit ope
21630 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74  ration, in addit
21640 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79  ion to the.** sy
21650 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ncs associated w
21660 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a  ith NORMAL..**.*
21670 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65  * Do not confuse
21680 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
21690 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59  L with SQLITE_SY
216a0 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a  NC_FULL.  The.**
216b0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
216c0 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f  L macro means to
216d0 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d   use the MacOSX-
216e0 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63  style full-fsync
216f0 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  .** using fcntl(
21700 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53  F_FULLFSYNC).  S
21710 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
21720 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e  L means to do an
21730 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79  .** ordinary fsy
21740 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72  nc() call.  Ther
21750 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
21760 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54  ce between SQLIT
21770 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61  E_SYNC_FULL.** a
21780 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  nd SQLITE_SYNC_N
21790 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72  ORMAL on platfor
217a0 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61  ms other than Ma
217b0 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a  cOSX.  But the.*
217c0 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  * synchronous=FU
217d0 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72  LL versus synchr
217e0 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74  onous=NORMAL set
217f0 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20  ting determines 
21800 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e  when.** the xSyn
21810 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63  c primitive is c
21820 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c  alled and is rel
21830 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61  evant to all pla
21840 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75  tforms..**.** Nu
21850 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
21860 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
21870 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
21880 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
21890 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
218a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
218b0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
218c0 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
218d0 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
218e0 76 65 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50  vel(.  Pager *pP
218f0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
21900 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
21910 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
21920 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c  r */.  int level
21930 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
21940 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
21950 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f  us.  1=OFF, 2=NO
21960 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20  RMAL, 3=FULL */ 
21970 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46 73 79   .  int bFullFsy
21980 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50 52 41  nc,       /* PRA
21990 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20 2a 2f  GMA fullfsync */
219a0 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 75 6c 6c  .  int bCkptFull
219b0 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 52 41 47  Fsync    /* PRAG
219c0 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75  MA checkpoint_fu
219d0 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20  llfsync */.){.  
219e0 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31  assert( level>=1
219f0 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a   && level<=3 );.
21a00 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
21a10 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
21a20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21a30 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
21a40 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
21a50 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
21a60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
21a70 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  :0;.  if( pPager
21a80 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
21a90 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
21aa0 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  s = 0;.    pPage
21ab0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21ac0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
21ad0 28 20 62 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a  ( bFullFsync ){.
21ae0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
21af0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
21b00 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
21b10 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21b20 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21b30 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
21b40 69 66 28 20 62 43 6b 70 74 46 75 6c 6c 46 73 79  if( bCkptFullFsy
21b50 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
21b60 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
21b70 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
21b80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
21b90 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
21ba0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
21bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
21bc0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
21bd0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
21be0 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
21bf0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
21c00 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
21c10 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
21c20 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
21c30 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
21c40 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
21c50 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
21c60 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
21c70 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
21c80 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
21c90 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
21ca0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
21cb0 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
21cc0 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
21cd0 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
21ce0 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
21cf0 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
21d00 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
21d10 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
21d20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
21d30 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
21d40 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
21d50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
21d60 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
21d70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
21d80 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
21d90 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
21da0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
21db0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
21dc0 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
21dd0 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
21de0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
21df0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
21e00 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
21e10 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
21e20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
21e30 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
21e40 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
21e50 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
21e60 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
21e70 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
21e80 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
21e90 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
21ea0 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
21eb0 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
21ec0 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
21ed0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
21ee0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
21ef0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
21f00 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
21f10 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
21f20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
21f30 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
21f40 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
21f50 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
21f60 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
21f70 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
21f80 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
21f90 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
21fa0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
21fb0 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
21fc0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
21fd0 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
21fe0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
21ff0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
22000 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
22010 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
22020 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22030 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22040 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
22050 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
22060 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
22070 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
22080 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
22090 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
220a0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
220b0 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
220c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
220d0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
220e0 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
220f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22100 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
22110 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
22120 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
22130 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
22140 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
22150 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
22160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
22170 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
22180 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
22190 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
221a0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
221b0 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
221c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
221d0 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
221e0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
221f0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
22200 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
22210 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
22220 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
22230 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
22240 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
22250 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
22260 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
22270 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
22280 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
22290 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
222a0 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
222b0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
222c0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
222d0 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
222e0 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
222f0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
22300 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
22310 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
22320 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
22330 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
22340 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
22350 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
22380 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
22390 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
223a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
223b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
223c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
223d0 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
223e0 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
223f0 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
22400 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
22410 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
22420 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
22430 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
22440 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
22450 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
22460 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
22470 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
22480 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
22490 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
224a0 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
224b0 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
224c0 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
224d0 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
224e0 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
224f0 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
22500 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
22510 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
22520 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
22530 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
22540 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
22550 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
22560 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22580 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
22590 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
225a0 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
225b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
225c0 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
225d0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
225e0 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
225f0 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
22600 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
22610 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
22620 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
22630 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75    .  pPager->xBu
22640 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
22650 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
22660 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
22670 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
22680 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erArg;.}../*.** 
22690 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
226a0 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
226b0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
226c0 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
226d0 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
226e0 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
226f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
22700 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
22710 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
22720 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
22730 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
22740 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
22750 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
22760 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
22770 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
22780 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
22790 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
227a0 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
227b0 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
227c0 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
227d0 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
227e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
227f0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
22800 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
22810 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
22820 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
22830 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
22840 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
22850 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
22860 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
22870 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
22880 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
22890 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
228a0 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
228b0 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
228c0 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
228d0 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
228e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
228f0 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
22900 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
22910 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
22920 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
22930 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
22940 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
22950 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
22960 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
22970 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
22980 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
22990 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
229a0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
229b0 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
229c0 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
229d0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
229e0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
229f0 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
22a00 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
22a10 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
22a20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
22a30 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
22a40 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
22a50 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
22a60 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
22a70 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
22a80 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
22a90 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
22aa0 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
22ab0 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
22ac0 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
22ad0 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
22ae0 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
22af0 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
22b00 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
22b10 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
22b20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
22b30 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
22b40 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
22b50 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
22b60 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
22b70 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
22b80 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
22b90 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
22ba0 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
22bb0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
22bc0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
22bd0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
22be0 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
22bf0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
22c00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22c10 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
22c20 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
22c30 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
22c40 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
22c50 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
22c60 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
22c70 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
22c80 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
22c90 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
22ca0 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
22cb0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
22cc0 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
22cd0 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
22ce0 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
22cf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
22d00 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
22d10 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
22d20 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
22d30 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
22d40 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
22d50 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
22d60 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
22d70 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
22d80 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
22d90 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
22da0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
22db0 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
22dc0 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
22dd0 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
22de0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
22df0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
22e00 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
22e10 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
22e20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
22e30 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
22e40 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
22e50 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
22e60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
22e70 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
22e80 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
22e90 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22ea0 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
22eb0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
22ec0 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
22ed0 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
22ee0 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
22ef0 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
22f00 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
22f10 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
22f20 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
22f30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
22f40 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
22f50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
22f60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
22f70 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
22f80 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
22f90 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
22fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22fb0 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
22fc0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
22fd0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
22fe0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
22ff0 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
23000 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23010 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
23020 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23030 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
23040 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
23050 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
23060 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
23070 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
23080 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
23090 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
230a0 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Size;.      sqli
230b0 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
230c0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
230d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
230e0 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
230f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
23100 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
23110 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
23120 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
23130 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
23140 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
23150 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
23160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23170 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
23180 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
23190 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
231a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
231b0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
231c0 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
231d0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
231e0 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
231f0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
23200 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
23210 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23220 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23230 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
23240 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
23250 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
23260 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
23270 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
23280 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
23290 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
232a0 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
232b0 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
232c0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
232d0 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
232e0 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
232f0 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
23300 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
23310 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
23320 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
23330 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
23340 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
23350 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
23360 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
23370 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
23380 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
23390 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
233a0 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
233b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
233c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
233d0 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
233e0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
233f0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
23400 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
23410 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
23420 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
23430 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
23440 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
23450 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
23460 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
23470 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
23480 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
23490 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
234a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
234b0 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
234c0 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
234d0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
234e0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
234f0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
23500 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
23510 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
23520 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
23530 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
23540 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
23550 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
23560 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
23570 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
23580 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20  ER_OPEN );      
23590 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62  /* Called only b
235a0 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f  y OP_MaxPgcnt */
235b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
235c0 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65  r->mxPgno>=pPage
235d0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a  r->dbSize );  /*
235e0 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66   OP_MaxPgcnt enf
235f0 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  orces this */.  
23600 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
23610 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
23620 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
23630 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
23640 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
23650 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
23660 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
23670 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
23680 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
23690 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
236a0 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
236b0 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
236c0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
236d0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
236e0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
236f0 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
23700 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
23710 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
23720 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
23730 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
23740 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
23750 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
23760 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
23770 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
23780 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
23790 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
237a0 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
237b0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
237c0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
237d0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
237e0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
237f0 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
23800 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
23810 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
23820 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
23830 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
23840 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
23850 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
23860 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
23870 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
23880 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23890 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
238a0 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
238b0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
238c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
238d0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
238e0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
238f0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
23900 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
23910 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
23920 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
23930 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
23940 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
23950 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
23960 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
23970 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
23980 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
23990 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
239a0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
239b0 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
239c0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
239d0 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
239e0 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
239f0 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
23a00 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23a10 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
23a20 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
23a30 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
23a40 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
23a50 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
23a60 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
23a70 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
23a80 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
23a90 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
23aa0 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
23ab0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
23ac0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
23ad0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
23ae0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
23af0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
23b00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
23b10 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
23b20 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
23b30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23b40 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
23b50 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
23b60 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
23b70 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
23b80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23b90 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
23ba0 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
23bb0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
23bc0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
23bd0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
23be0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
23bf0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
23c00 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64  d by btree immed
23c10 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65  iately after cre
23c20 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50  ating.  ** the P
23c30 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68  ager object.  Th
23c40 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ere has not been
23c50 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
23c60 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20  to transition.  
23c70 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79  ** to WAL mode y
23c80 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
23c90 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
23ca0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
23cb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
23cc0 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
23cd0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
23ce0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
23cf0 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
23d00 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
23d10 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
23d20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
23d30 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
23d40 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
23d50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23d60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
23d70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23d80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23d90 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
23da0 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74  ed when a read-t
23db0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
23dc0 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  en on.** the pag
23dd0 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  er. It returns t
23de0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
23df0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
23e00 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
23e10 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
23e20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
23e30 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
23e40 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
23e50 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
23e60 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
23e70 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76   page file..*/.v
23e80 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23e90 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
23ea0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
23eb0 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
23ec0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
23ed0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
23ee0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23ef0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
23f00 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
23f10 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
23f20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
23f30 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.}.../*.** T
23f40 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
23f50 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
23f60 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
23f70 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
23f80 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
23f90 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
23fa0 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
23fb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
23fc0 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
23fd0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
23fe0 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
23ff0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
24000 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
24010 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
24020 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
24030 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
24040 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
24050 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
24060 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
24070 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
24080 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
24090 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
240a0 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
240b0 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
240c0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
240d0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
240e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
240f0 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
24100 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
24110 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
24120 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
24130 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
24140 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
24150 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
24160 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
24170 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
24180 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24190 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
241a0 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
241b0 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
241c0 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
241d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
24200 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
24210 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
24220 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f  s is either a no
24230 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65  -op (because the
24240 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
24250 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  is .  ** already
24260 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66   held, or one of
24270 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e   the transistion
24280 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d  s that the busy-
24290 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79  handler.  ** may
242a0 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69   be invoked duri
242b0 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ng, according to
242c0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
242d0 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  ve.  ** sqlite3P
242e0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
242f0 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
24300 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
24310 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20  ock>=locktype). 
24320 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
24330 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
24340 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
24350 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
24360 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
24370 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
24380 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
24390 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
243a0 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20    );..  do {.   
243b0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
243c0 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  b(pPager, lockty
243d0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  pe);.  }while( r
243e0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
243f0 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
24400 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
24410 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
24420 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24430 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
24440 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
24450 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
24460 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
24470 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
24480 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
24490 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
244a0 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
244b0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
244c0 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
244d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
244e0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
244f0 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
24500 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
24510 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
24520 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
24530 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
24540 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
24550 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
24560 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
24570 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
24580 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
24590 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
245a0 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
245b0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
245c0 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
245d0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
245e0 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
245f0 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
24600 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
24610 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
24620 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
24630 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
24640 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
24650 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
24660 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
24670 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
24680 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
24690 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
246a0 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
246b0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
246c0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
246d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
246e0 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
246f0 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
24700 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
24710 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
24720 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
24730 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75 72  orrect behaviour
24740 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
24750 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
24760 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
24770 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
24780 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
24790 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
247a0 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
247b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
247c0 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
247d0 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
247e0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
247f0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
24800 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
24810 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
24820 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
24830 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
24840 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
24850 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
24860 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
24870 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
24880 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
24890 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
248a0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
248b0 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
248c0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
248d0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
248e0 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
248f0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
24900 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
24910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
24920 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
24930 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
24940 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
24950 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
24960 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
24970 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
24980 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24990 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
249a0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
249b0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
249c0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
249d0 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
249e0 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
249f0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
24a00 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
24a10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
24a20 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
24a30 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
24a40 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
24a50 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
24a60 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
24a70 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
24a80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24a90 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
24aa0 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
24ab0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
24ac0 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
24ad0 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
24ae0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
24af0 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
24b00 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
24b10 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
24b20 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itted..*/.void s
24b30 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
24b40 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
24b50 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
24b60 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
24b70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
24b80 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
24b90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24ba0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
24bb0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
24bc0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
24bd0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
24be0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
24bf0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
24c00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24c10 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
24c20 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
24c30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
24c40 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
24c50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
24c60 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
24c70 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
24c80 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
24c90 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
24ca0 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
24cb0 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
24cc0 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
24cd0 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
24ce0 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
24cf0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
24d00 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
24d10 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
24d20 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
24d30 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
24d40 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
24d50 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
24d60 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
24d70 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
24d80 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
24d90 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
24da0 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
24db0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
24dc0 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
24dd0 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
24de0 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
24df0 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
24e00 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
24e10 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
24e20 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
24e30 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
24e40 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
24e50 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
24e60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
24e70 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
24e80 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
24e90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24ea0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
24eb0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
24ec0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24ed0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
24ee0 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
24ef0 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
24f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24f10 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
24f20 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
24f30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
24f40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
24f50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24f60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
24f70 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
24f80 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
24f90 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
24fa0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
24fb0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
24fc0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
24fd0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
24fe0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
24ff0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
25000 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
25010 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
25020 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
25030 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
25040 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
25050 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
25060 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
25070 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
25080 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
25090 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
250a0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
250b0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
250c0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
250d0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
250e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
250f0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
25100 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
25110 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
25120 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
25130 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
25140 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
25150 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
25160 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
25170 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
25180 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
25190 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
251a0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
251b0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
251c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
251d0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
251e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
251f0 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
25200 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
25210 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
25220 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
25230 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62  ager) );.  disab
25240 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25250 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
25260 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
25270 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50 61  lloc();.  /* pPa
25280 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
25290 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
252a0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
252b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
252c0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69  _OMIT_WAL.  sqli
252d0 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
252e0 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
252f0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c  ->ckptSyncFlags,
25300 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
25310 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67  e, pTmp);.  pPag
25320 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
25330 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
25340 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
25350 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
25360 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
25370 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
25380 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
25390 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
253a0 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
253b0 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
253c0 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
253d0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
253e0 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
253f0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
25400 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
25410 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
25420 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
25430 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
25440 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
25450 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
25460 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
25470 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
25480 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
25490 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
254a0 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
254b0 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
254c0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
254d0 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
254e0 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
254f0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
25500 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
25510 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
25520 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
25530 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
25540 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
25550 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
25560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
25570 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
25580 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
25590 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
255a0 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
255b0 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
255c0 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
255d0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
255e0 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
255f0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
25600 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
25610 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
25620 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25630 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
25640 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
25650 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
25660 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
25670 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
25680 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
25690 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
256a0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
256b0 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
256c0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
256d0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
256e0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
256f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
25700 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
25710 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
25720 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
25730 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
25740 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
25750 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
25760 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
25770 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
25780 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
25790 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
257a0 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
257b0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
257c0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
257d0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
257e0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
257f0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
25800 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
25810 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
25820 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
25830 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
25840 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
25850 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
25860 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
25870 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
25880 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
25890 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
258a0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
258b0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
258c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
258d0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
258e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
258f0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
25900 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
25910 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
25920 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
25930 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
25940 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
25950 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
25960 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
25970 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
25980 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
25990 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
259a0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
259b0 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
259c0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
259d0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
259e0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
259f0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
25a00 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
25a10 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
25a20 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
25a30 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
25a40 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
25a50 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
25a60 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
25a70 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
25a80 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
25a90 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
25aa0 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
25ab0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
25ac0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25ad0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
25ae0 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
25af0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
25b00 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
25b10 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
25b20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
25b30 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
25b40 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
25b50 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
25b60 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
25b70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25b80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
25b90 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
25ba0 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
25bb0 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
25bc0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
25bd0 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
25be0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
25bf0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
25c00 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
25c10 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
25c20 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
25c30 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
25c40 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
25c50 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
25c60 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
25c70 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
25c80 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
25c90 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
25ca0 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
25cb0 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
25cc0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
25cd0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
25ce0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
25cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25d00 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
25d10 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
25d20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
25d30 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
25d40 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
25d50 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
25d60 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
25d70 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
25d80 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
25d90 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
25da0 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
25db0 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
25dc0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
25dd0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
25de0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
25df0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
25e00 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
25e10 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
25e20 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
25e30 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
25e40 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
25e50 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
25e60 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
25e70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
25e80 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
25e90 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
25ea0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
25eb0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
25ec0 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
25ed0 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
25ee0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
25ef0 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
25f00 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
25f10 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
25f20 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
25f30 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
25f40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
25f50 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
25f60 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
25f70 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
25f80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25f90 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
25fa0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25fc0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
25fd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25fe0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
25ff0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
26000 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
26010 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
26020 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
26030 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
26040 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
26050 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
26060 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
26070 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
26080 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
26090 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
260a0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
260b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
260c0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
260d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
260e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
260f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
26100 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
26110 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
26120 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26130 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
26140 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
26150 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
26160 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
26170 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
26180 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
26190 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
261a0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
261b0 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
261c0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
261d0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
261e0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
261f0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
26200 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
26210 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
26220 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
26230 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
26240 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
26250 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
26260 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
26270 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
26280 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
26290 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
262a0 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
262b0 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
262c0 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
262d0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
262e0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
262f0 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
26300 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
26310 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
26320 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
26330 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
26340 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
26350 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
26360 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
26370 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
26380 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
26390 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
263a0 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
263b0 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
263c0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
263d0 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
263e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
263f0 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
26400 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
26410 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26420 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
26430 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
26440 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
26450 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
26460 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
26470 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
26480 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
26490 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
264a0 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
264b0 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
264c0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
264d0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
264e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
264f0 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
26500 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
26510 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
26520 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
26530 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
26540 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
26550 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
26560 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
26570 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
26580 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
26590 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
265a0 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
265b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
265c0 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
265d0 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
265e0 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
265f0 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
26600 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
26610 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
26620 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
26630 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
26640 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
26650 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
26660 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
26670 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
26680 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
26690 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
266a0 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
266b0 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
266c0 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
266d0 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
266e0 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
266f0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
26700 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
26710 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
26720 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
26730 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
26740 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
26750 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26760 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
26770 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
26780 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
26790 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
267a0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
267b0 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
267c0 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
267d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
267e0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
267f0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
26800 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
26810 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
26820 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
26830 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
26840 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
26850 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
26860 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
26870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26880 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
26890 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
268a0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
268b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
268c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
268d0 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
268e0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
268f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
26900 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
26910 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
26920 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26930 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
26940 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
26950 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
26960 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
26970 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
26980 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
26990 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
269a0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
269b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
269c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
269d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
269e0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
269f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
26a00 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
26a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
26a20 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
26a30 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
26a40 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
26a50 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
26a60 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
26a70 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
26a80 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
26a90 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
26aa0 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
26ab0 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
26ac0 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
26ad0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
26ae0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
26af0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
26b00 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
26b10 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
26b20 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
26b30 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
26b40 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
26b50 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
26b60 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
26b70 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
26b80 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
26b90 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
26ba0 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
26bb0 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
26bc0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
26bd0 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
26be0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
26bf0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
26c00 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
26c10 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
26c20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
26c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
26c40 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
26c50 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
26c60 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
26c70 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
26c80 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
26c90 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
26ca0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
26cb0 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
26cc0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
26cd0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
26ce0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
26cf0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26d00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
26d10 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
26d20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26d50 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
26d60 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
26d70 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
26d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26d90 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
26da0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
26db0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
26dc0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
26dd0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
26de0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
26df0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
26e00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26e10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26e20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26e30 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
26e40 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26e50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
26e60 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
26e70 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
26e80 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
26e90 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
26ea0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
26eb0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
26ec0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
26ed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
26ee0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
26ef0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
26f00 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
26f10 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
26f20 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
26f30 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
26f40 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
26f50 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
26f60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26f80 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
26f90 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
26fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26fb0 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
26fc0 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
26fd0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
26fe0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
26ff0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
27000 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
27010 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
27020 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
27030 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27040 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27050 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
27060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
27070 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
27080 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
27090 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
270a0 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
270b0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
270c0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
270d0 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
270e0 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
270f0 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
27100 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
27110 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
27120 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
27130 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
27140 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
27150 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
27160 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
27170 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
27180 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
27190 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
271a0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
271b0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
271c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
271d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
271e0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
271f0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
27200 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
27210 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
27220 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
27230 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
27240 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
27250 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
27260 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
27270 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
27280 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
27290 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
272a0 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
272b0 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
272c0 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
272d0 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
272e0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
272f0 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
27300 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
27310 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
27320 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
27330 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
27340 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
27350 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
27360 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
27370 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27380 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
27390 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
273a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
273b0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
273c0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
273d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
273e0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
273f0 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
27400 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
27410 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
27420 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
27430 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
27440 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
27450 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
27460 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
27470 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
27480 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
27490 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
274a0 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
274b0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
274c0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
274d0 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
274e0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
274f0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
27500 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
27510 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
27520 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
27530 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
27540 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
27550 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
27560 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
27570 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
27580 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
27590 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
275a0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
275b0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
275c0 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
275d0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
275e0 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
275f0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
27600 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
27610 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
27620 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
27630 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
27640 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
27650 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
27660 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
27670 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
27680 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
27690 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
276a0 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
276b0 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
276c0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
276d0 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
276e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
276f0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
27700 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
27710 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27720 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
27730 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
27740 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
27750 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
27760 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
27770 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
27780 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
27790 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
277a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
277b0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
277c0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
277d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
277e0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
277f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27810 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27820 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
27830 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
27840 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
27850 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
27860 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
27870 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
27880 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
27890 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
278a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
278b0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
278c0 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
278d0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
278e0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
278f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
27900 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
27910 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
27920 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
27930 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
27940 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
27950 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
27960 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
27970 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
27980 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
27990 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
279a0 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
279b0 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
279c0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
279d0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
279e0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
279f0 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
27a00 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
27a10 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
27a20 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
27a30 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
27a40 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
27a50 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
27a60 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
27a70 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
27a80 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
27a90 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
27aa0 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
27ab0 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
27ac0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
27ad0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
27ae0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
27af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27b00 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
27b10 65 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  e>pPager->dbHint
27b20 53 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Size ){.    sqli
27b30 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
27b40 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
27b50 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
27b60 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
27b70 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
27b80 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
27b90 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
27ba0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
27bb0 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
27bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
27bd0 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
27be0 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
27bf0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
27c00 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
27c10 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
27c20 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
27c30 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
27c40 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
27c50 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
27c60 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
27c70 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
27c80 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
27c90 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
27ca0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
27cb0 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
27cc0 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
27cd0 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
27ce0 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
27cf0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
27d00 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
27d10 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
27d20 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
27d30 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
27d40 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
27d50 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
27d60 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
27d70 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
27d80 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
27d90 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
27da0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
27db0 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
27dc0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
27dd0 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
27de0 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
27df0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
27e00 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
27e10 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
27e20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
27e30 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
27e40 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
27e50 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
27e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
27e90 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
27ea0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
27eb0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
27ec0 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
27ed0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
27ee0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
27ef0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
27f00 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
27f10 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
27f20 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
27f30 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
27f40 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
27f50 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
27f60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
27f70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
27f80 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
27f90 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
27fa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
27fb0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
27fc0 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
27fd0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
27fe0 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
27ff0 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
28000 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
28010 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
28020 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
28030 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
28040 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
28050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
28060 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
28070 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
28080 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
28090 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
280a0 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
280b0 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
280c0 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
280d0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
280e0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
280f0 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
28100 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
28110 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
28120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28130 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
28140 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
28150 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
28160 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
28170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
28180 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
28190 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b  R_STAT_WRITE]++;
281a0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
281b0 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
281c0 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
281d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
281e0 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
281f0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
28200 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
28210 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
28220 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b  *)pList->pData);
28230 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ..      PAGERTRA
28240 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE(("STORE %d pa
28250 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
28260 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28270 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
28280 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
28290 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
282a0 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ist)));.      IO
282b0 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
282c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
282d0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
282e0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
282f0 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
28300 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ount);.    }else
28310 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
28320 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
28330 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
28340 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
28350 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o));.    }.    p
28360 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
28370 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  h(pList);.    pL
28380 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
28390 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
283a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
283b0 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
283c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
283d0 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
283e0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
283f0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
28400 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
28410 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
28420 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
28430 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
28440 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
28450 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
28460 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
28470 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
28480 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
28490 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
284a0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
284b0 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
284c0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
284d0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
284e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
284f0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
28500 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
28510 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
28520 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
28530 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
28540 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
28550 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
28560 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
28570 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
28580 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
28590 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
285a0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
285b0 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
285c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
285d0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
285e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
285f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
28600 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
28610 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
28620 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
28630 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
28640 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
28650 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
28660 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
28670 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
28680 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
28690 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
286a0 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
286b0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
286c0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
286d0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
286e0 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
286f0 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
28700 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
28710 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
28720 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
28730 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
28740 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
28750 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
28760 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
28770 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
28780 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
28790 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
287a0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
287b0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
287c0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
287d0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
287e0 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
287f0 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
28800 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
28810 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
28820 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
28830 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
28840 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
28850 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
28860 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
28870 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
28880 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
28890 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
288a0 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
288b0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
288c0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
288d0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
288e0 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
288f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28900 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
28910 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
28920 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28930 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
28940 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
28950 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
28960 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
28970 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
28980 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
28990 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
289a0 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
289b0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
289c0 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
289d0 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
289e0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
289f0 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
28a00 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
28a10 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
28a20 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
28a30 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
28a40 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
28a50 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
28a60 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
28a70 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
28a80 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
28a90 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
28aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28ab0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
28ac0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
28ad0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
28ae0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75  (i64)pPager->nSu
28af0 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
28b00 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
28b10 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
28b20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70   .      CODEC2(p
28b30 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
28b40 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
28b50 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
28b60 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
28b70 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
28b80 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
28b90 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
28ba0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
28bb0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
28bc0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
28bd0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
28be0 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
28bf0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28c10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28c20 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
28c30 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
28c40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
28c50 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
28c60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
28c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28c80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
28c90 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
28ca0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
28cb0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
28cc0 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
28cd0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
28ce0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
28cf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
28d10 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
28d20 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
28d30 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
28d40 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
28d50 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
28d60 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
28d70 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
28d80 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
28d90 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
28da0 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
28db0 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
28dc0 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
28dd0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
28de0 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
28df0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
28e00 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
28e10 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
28e20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
28e30 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
28e40 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
28e50 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
28e60 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
28e70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
28e80 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
28e90 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
28ea0 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
28eb0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
28ec0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
28ed0 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
28ee0 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
28ef0 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
28f00 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
28f10 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
28f20 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
28f30 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
28f40 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
28f50 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
28f60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
28f70 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
28f80 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
28f90 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
28fa0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
28fb0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
28fc0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
28fd0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
28fe0 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
28ff0 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
29000 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29010 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
29020 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
29030 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
29040 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
29050 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
29060 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
29070 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
29080 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
29090 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
290a0 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
290b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
290c0 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
290d0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
290e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
290f0 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
29100 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29110 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
29120 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
29130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
29140 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
29150 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
29160 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
29170 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69  flag is set duri
29180 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
29190 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
291a0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
291b0 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
291c0 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
291d0 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
291e0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
291f0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
29200 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
29210 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
29220 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
29230 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
29240 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
29250 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
29260 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  he doNotSpill fl
29270 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ag inhibits all 
29280 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72  cache spilling r
29290 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
292a0 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74  ther.  ** or not
292b0 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
292c0 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
292d0 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  t during a rollb
292e0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ack..  **.  ** S
292f0 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
29300 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
29310 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
29320 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
29330 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
29340 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
29350 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
29360 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
29370 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ton it .  ** is 
29380 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
29390 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
293a0 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
293b0 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
293c0 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==1.  ** while i
293d0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
293e0 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
293f0 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
29400 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
29410 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
29420 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
29430 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
29440 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
29450 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
29460 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
29470 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
29480 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
29490 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
294a0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
294b0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
294c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
294d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
294e0 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72  NotSpill ) retur
294f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
29500 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
29510 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50  SyncSpill && (pP
29520 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
29530 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
29540 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29550 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
29560 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
29570 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
29580 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
29590 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
295a0 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
295b0 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
295c0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75  g. */.    if( su
295d0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
295e0 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63  Pg) ){ .      rc
295f0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
29600 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20  e(pPg); .    }. 
29610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
29630 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
29640 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
29650 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
29660 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  lse{.  .    /* S
29670 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
29680 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
29690 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
296a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
296b0 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
296c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
296d0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
296e0 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
296f0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
29700 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
29710 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
29720 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
29730 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65  ber of this page
29740 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
29750 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
29760 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   of.    ** the d
29770 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
29780 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
29790 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
297a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  sub-journal..   
297b0 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
297c0 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
297d0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
297e0 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
297f0 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74  l not.    ** act
29800 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61  ually write data
29810 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20   to the file in 
29820 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a  this case..    *
29830 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65  *.    ** Conside
29840 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
29850 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
29860 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ts:.    **.    *
29870 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a  *   BEGIN;.    *
29880 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
29890 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
298a0 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
298b0 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56  >.    **     SAV
298c0 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a  EPOINT sp;.    *
298d0 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20  *       <shrink 
298e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
298f0 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a   Y pages>.    **
29900 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
29910 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a  ss(page X).    *
29920 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
29930 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  O sp;.    **.   
29940 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
29950 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
29960 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
29970 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
29980 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
29990 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
299a0 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69  ase file, but wi
299b0 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
299c0 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68  om the cache. Th
299d0 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  en,.    ** follo
299e0 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
299f0 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
29a00 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
29a10 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
29a20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
29a30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29a40 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
29a50 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
29a60 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77  X as it.    ** w
29a70 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  as when the tran
29a80 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
29a90 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77   not as it was w
29aa0 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73  hen "SAVEPOINT s
29ab0 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78  p".    ** was ex
29ac0 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  ecuted..    **. 
29ad0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
29ae0 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
29af0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
29b00 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
29b10 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
29b20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
29b30 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29b40 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
29b50 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
29b60 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65     ** be restore
29b70 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  d to its current
29b80 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
29b90 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
29ba0 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63   is .    ** exec
29bb0 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uted..    */.   
29bc0 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20   if( NEVER(.    
29bd0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
29be0 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
29bf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
29c00 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
29c10 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a  e(pPg).    ) ){.
29c20 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
29c30 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
29c40 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
29c50 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
29c60 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
29c70 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
29c80 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
29c90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29ca0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
29cb0 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
29cc0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
29cd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
29ce0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
29cf0 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50  elist(pPager, pP
29d00 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
29d10 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
29d20 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
29d30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29d40 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
29d50 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
29d60 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
29d70 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
29d80 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
29d90 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
29da0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
29db0 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
29dc0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
29dd0 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ); .}.../*.** Al
29de0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
29df0 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
29e00 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
29e10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
29e20 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
29e30 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
29e40 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
29e50 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
29e60 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
29e70 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
29e80 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
29e90 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
29ea0 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
29eb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
29ec0 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
29ed0 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
29ee0 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
29ef0 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
29f00 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
29f10 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
29f20 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
29f30 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
29f40 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
29f50 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
29f60 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
29f70 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
29f80 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
29f90 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
29fa0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
29fb0 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
29fc0 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
29fd0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
29fe0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
29ff0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
2a000 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2a010 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
2a020 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
2a030 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
2a040 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2a050 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
2a060 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
2a070 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
2a080 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
2a090 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
2a0a0 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
2a0b0 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
2a0c0 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
2a0d0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
2a0e0 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
2a0f0 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
2a100 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
2a110 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
2a120 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
2a130 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
2a140 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
2a150 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
2a160 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a  * of the PAGER_*
2a170 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
2a180 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
2a190 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
2a1a0 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
2a1b0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2a1c0 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
2a1d0 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
2a1e0 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
2a1f0 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
2a200 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
2a210 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
2a220 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
2a230 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2a240 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
2a250 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
2a260 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2a270 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
2a280 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
2a290 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
2a2a0 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
2a2b0 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
2a2c0 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
2a2d0 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
2a2e0 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
2a2f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2a300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2a310 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
2a320 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
2a330 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
2a340 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
2a350 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
2a360 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
2a370 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
2a380 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2a390 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2a3a0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
2a3b0 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
2a3c0 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
2a3d0 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
2a3e0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
2a3f0 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
2a400 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2a410 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2a420 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2a430 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
2a440 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a450 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2a460 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
2a470 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2a480 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
2a490 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2a4a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
2a4b0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2a4c0 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
2a4d0 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
2a4e0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
2a4f0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
2a500 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
2a510 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
2a520 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
2a530 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
2a540 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
2a550 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
2a560 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
2a570 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
2a580 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2a590 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
2a5a0 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
2a5b0 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
2a5c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
2a5d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2a5e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a5f0 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
2a600 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2a610 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
2a620 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
2a630 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
2a640 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
2a650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2a660 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2a670 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
2a680 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
2a690 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2a6a0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2a6b0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
2a6c0 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
2a6d0 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
2a6e0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2a6f0 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
2a700 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
2a710 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
2a720 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
2a730 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
2a740 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
2a750 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2a760 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2a770 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
2a780 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
2a790 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
2a7a0 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
2a7b0 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
2a7c0 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
2a7d0 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  l */.  int pcach
2a7e0 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
2a7f0 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
2a800 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2a810 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
2a820 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61  he */.  u32 szPa
2a830 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2a840 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2a850 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
2a860 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f  age size */.  co
2a870 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d  nst char *zUri =
2a880 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72   0;    /* URI ar
2a890 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  gs to copy */.  
2a8a0 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20  int nUri = 0;   
2a8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a8c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55  er of bytes of U
2a8d0 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69  RI args at *zUri
2a8e0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
2a8f0 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
2a900 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
2a910 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2a920 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
2a930 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
2a940 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
2a950 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
2a960 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
2a970 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
2a980 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
2a990 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
2a9a0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
2a9b0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
2a9c0 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
2a9d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
2a9e0 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
2a9f0 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
2aa00 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
2aa10 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
2aa20 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
2aa30 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
2aa40 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
2aa50 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
2aa60 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
2aa70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
2aa80 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2aa90 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
2aaa0 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
2aab0 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
2aac0 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
2aad0 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
2aae0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
2aaf0 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
2ab00 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2ab10 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2ab20 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
2ab30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
2ab40 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2ab50 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
2ab60 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
2ab70 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
2ab80 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
2ab90 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
2aba0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2abb0 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
2abc0 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2abd0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
2abe0 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  DB.  if( flags &
2abf0 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b   PAGER_MEMORY ){
2ac00 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a  .    memDb = 1;.
2ac10 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
2ac20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
2ac30 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2ac40 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2ac50 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2ac60 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2ac70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2ac80 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2ac90 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2aca0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2acb0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2acc0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2acd0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2ace0 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2acf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2ad00 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2ad10 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2ad20 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2ad30 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2ad40 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2ad50 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2ad60 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
2ad70 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
2ad80 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2ad90 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
2ada0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2adb0 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e      }.    zPathn
2adc0 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d  ame[0] = 0; /* M
2add0 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c  ake sure initial
2ade0 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c  ized even if Ful
2adf0 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c  lPathname() fail
2ae00 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  s */.    rc = sq
2ae10 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
2ae20 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2ae30 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
2ae40 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2ae50 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2ae60 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2ae70 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  hname);.    z = 
2ae80 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d  zUri = &zFilenam
2ae90 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
2aea0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b  0(zFilename)+1];
2aeb0 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
2aec0 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  {.      z += sql
2aed0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2aee0 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  1;.      z += sq
2aef0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2af00 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55  +1;.    }.    nU
2af10 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d  ri = (int)(&z[1]
2af20 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73   - zUri);.    as
2af30 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b  sert( nUri>=0 );
2af40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2af50 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e  ITE_OK && nPathn
2af60 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61  ame+8>pVfs->mxPa
2af70 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
2af80 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
2af90 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  s taken when the
2afa0 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65   journal path re
2afb0 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2afc0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2afd0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c  being opened wil
2afe0 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70  l be more than p
2aff0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
2b000 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69        ** bytes i
2b010 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d  n length. This m
2b020 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
2b030 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  e cannot be open
2b040 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ed,.      ** as 
2b050 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
2b060 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
2b070 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2b080 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a   or even.      *
2b090 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f  * check for a ho
2b0a0 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t-journal before
2b0b0 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   reading..      
2b0c0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
2b0d0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2b0e0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
2b0f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b100 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2b110 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
2b120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2b130 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2b140 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2b150 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2b160 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2b170 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2b180 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2b190 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2b1a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2b1b0 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2b1c0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2b1d0 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2b1e0 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2b1f0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2b200 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2b210 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2b220 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2b230 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2b240 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2b250 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2b260 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2b270 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2b280 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2b290 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2b2a0 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2b2b0 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2b2c0 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2b2d0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2b2e0 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2b2f0 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2b300 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2b310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2b320 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2b330 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2b340 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2b350 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2b360 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2b370 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2b380 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2b390 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2b3a0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2b3b0 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2b3c0 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2b3d0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2b3e0 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2b3f0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2b400 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2b410 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2b420 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2b430 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2b440 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2b450 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2b460 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2b470 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2b480 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2b490 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2b4a0 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2b4b0 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2b4c0 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2b4d0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2b4e0 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2b4f0 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2b500 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2b510 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20   + 8 + 2        
2b520 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2b530 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2b540 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2b550 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2b560 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2b570 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
2b580 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
2b590 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2b5a0 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
2b5b0 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
2b5c0 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
2b5d0 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
2b5e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
2b5f0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2b600 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b610 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
2b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
2b630 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
2b640 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
2b650 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
2b660 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
2b670 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
2b680 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
2b690 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2b6a0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2b6b0 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
2b6c0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
2b6d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2b6e0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2b6f0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
2b700 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
2b710 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2b720 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2b730 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
2b740 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2b750 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
2b760 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2b770 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
2b780 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2b790 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
2b7a0 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
2b7b0 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
2b7c0 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
2b7d0 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
2b7e0 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
2b7f0 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
2b800 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
2b810 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29  t( nPathname>0 )
2b820 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  ;.    pPager->zJ
2b830 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
2b840 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
2b850 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29  name + 1 + nUri)
2b860 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2b870 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2b880 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2b890 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2b8a0 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2b8b0 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2b8c0 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2b8d0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2b8e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2b8f0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2b900 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2b910 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2b920 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2b930 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 31  ournal\000", 8+1
2b940 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2b950 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2b960 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2b970 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2b980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b990 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2b9a0 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2b9b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2b9c0 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2b9d0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2b9e0 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2b9f0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2ba00 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2ba10 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2ba20 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2ba30 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2ba40 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2ba50 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2ba60 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2ba70 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
2ba80 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
2ba90 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2baa0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2bab0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2bac0 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2bad0 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2bae0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2baf0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2bb00 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2bb10 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb30 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2bb40 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2bb50 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2bb60 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2bb70 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2bb80 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2bb90 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2bba0 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2bbb0 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2bbc0 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2bbd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2bbe0 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2bbf0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2bc00 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2bc10 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2bc20 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2bc30 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2bc40 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2bc50 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2bc60 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2bc70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bc80 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2bc90 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2bca0 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2bcb0 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2bcc0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2bcd0 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2bce0 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2bcf0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2bd00 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2bd10 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2bd20 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2bd30 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2bd40 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2bd50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2bd60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2bd70 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2bd80 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
2bd90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2bda0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2bdb0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2bdc0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2bdd0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2bde0 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2bdf0 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2be00 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2be10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2be20 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
2be30 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2be40 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
2be50 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2be60 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2be70 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2be80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2be90 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2bea0 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2beb0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2bec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2bed0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2bee0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2bef0 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
2bf00 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2bf10 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2bf20 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2bf30 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
2bf40 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
2bf50 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2bf60 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2bf70 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2bf80 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2bf90 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2bfa0 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2bfb0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2bfc0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2bfd0 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2bfe0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
2bff0 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2c000 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2c010 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2c020 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2c030 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
2c040 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2c050 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
2c060 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2c070 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2c080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c090 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2c0a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2c0b0 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2c0c0 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2c0d0 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2c0e0 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2c0f0 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2c100 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2c110 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2c120 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2c130 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2c140 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2c150 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2c160 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2c170 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2c180 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2c190 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2c1a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2c1b0 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2c1c0 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2c1d0 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2c1e0 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2c1f0 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2c200 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2c210 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2c220 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2c230 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2c240 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
2c250 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2c260 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2c270 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
2c280 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2c290 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2c2a0 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2c2b0 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2c2c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2c2d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2c2e0 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2c2f0 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2c300 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2c310 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2c320 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2c330 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2c340 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2c350 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2c360 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2c370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c390 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2c3a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c3b0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2c3c0 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2c3d0 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2c3e0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2c3f0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2c400 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2c410 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  urred in either 
2c420 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
2c430 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20  ove, free the . 
2c440 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   ** Pager struct
2c450 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2c460 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2c470 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c480 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c490 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
2c4a0 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ce );.    sqlite
2c4b0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2c4c0 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2c4d0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2c4e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c4f0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
2c500 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
2c510 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65  bject. */.  asse
2c520 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
2c530 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f  );.  nExtra = RO
2c540 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20  UND8(nExtra);.  
2c550 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2c560 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2c570 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c590 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2c5a0 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2c5b0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2c5c0 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47  pPCache);..  PAG
2c5d0 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
2c5e0 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
2c5f0 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
2c600 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
2c610 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
2c620 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
2c630 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2c640 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
2c650 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
2c660 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
2c670 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67  urnal;.  /* pPag
2c680 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
2c690 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2c6a0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
2c6b0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2c6c0 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
2c6d0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
2c6e0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2c6f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
2c700 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2c710 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
2c720 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2c730 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
2c740 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
2c750 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
2c760 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
2c770 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  K; */.#if 0.  as
2c780 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2c790 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
2c7a0 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
2c7b0 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
2c7c0 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  K) );.#endif.  /
2c7d0 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
2c7e0 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
2c7f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
2c800 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
2c810 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
2c820 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2c830 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
2c840 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
2c850 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2c860 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
2c870 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2c880 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2c890 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
2c8a0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2c8b0 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
2c8c0 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
2c8d0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2c8e0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2c8f0 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
2c900 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
2c910 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
2c920 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
2c930 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73  ly;.  assert( us
2c940 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
2c950 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2c960 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
2c970 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2c980 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
2c990 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2c9a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c9b0 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a  >fullSync==0 );.
2c9c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c9d0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30  er->syncFlags==0
2c9e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2c9f0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2ca00 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2ca10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
2ca20 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  kptSyncFlags==0 
2ca30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ca40 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2ca50 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2ca60 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2ca70 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2ca80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2ca90 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2caa0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2cab0 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  | WAL_SYNC_TRANS
2cac0 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61  ACTIONS;.    pPa
2cad0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2cae0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2caf0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
2cb00 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2cb10 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2cb20 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2cb30 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2cb40 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2cb50 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2cb60 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2cb70 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2cb80 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2cb90 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2cba0 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2cbb0 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2cbc0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2cbd0 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2cbe0 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2cbf0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2cc00 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2cc10 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2cc20 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2cc30 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2cc40 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2cc50 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2cc60 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2cc70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2cc80 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2cc90 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2cca0 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2ccb0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2ccc0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2ccd0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2cce0 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
2ccf0 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  it;.  /* memset(
2cd00 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
2cd10 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
2cd20 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20  >aHash)); */..  
2cd30 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
2cd40 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
2cd50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
2cd60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2cd70 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2cd80 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
2cd90 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
2cda0 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
2cdb0 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
2cdc0 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
2cdd0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
2cde0 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
2cdf0 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
2ce00 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
2ce10 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
2ce20 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
2ce30 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
2ce40 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
2ce50 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2ce60 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
2ce70 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
2ce80 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
2ce90 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
2cea0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
2ceb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2cec0 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2ced0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
2cee0 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
2cef0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2cf00 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cf10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2cf20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
2cf30 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2cf40 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
2cf50 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
2cf60 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
2cf70 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
2cf80 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
2cf90 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2cfa0 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
2cfb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
2cfc0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
2cfd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2cfe0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
2cff0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
2d000 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
2d010 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
2d020 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
2d030 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
2d040 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
2d050 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
2d060 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2d070 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
2d080 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
2d090 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
2d0a0 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
2d0b0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
2d0c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2d0d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2d0e0 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
2d0f0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
2d100 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2d110 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
2d120 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
2d130 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
2d140 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
2d150 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
2d160 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
2d170 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2d180 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2d190 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
2d1a0 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
2d1b0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
2d1c0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2d1d0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
2d1e0 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
2d1f0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
2d200 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2d210 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2d220 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
2d230 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
2d240 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
2d250 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
2d260 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
2d270 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
2d280 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
2d290 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2d2a0 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
2d2b0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2d2c0 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
2d2d0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
2d2e0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2d2f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2d300 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2d310 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
2d320 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2d330 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
2d340 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2d350 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
2d360 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
2d370 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2d380 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
2d390 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
2d3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2d3b0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
2d3c0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2d3d0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
2d3e0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
2d3f0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
2d400 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
2d410 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2d420 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d430 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
2d440 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
2d450 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d460 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
2d470 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
2d480 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
2d490 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
2d4a0 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
2d4b0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2d4c0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
2d4d0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2d4e0 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
2d4f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2d500 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
2d510 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
2d520 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
2d530 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2d540 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2d550 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
2d560 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
2d570 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
2d580 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
2d590 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
2d5a0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2d5b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
2d5c0 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
2d5d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
2d5e0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2d5f0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
2d600 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2d610 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
2d620 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
2d630 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d640 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
2d650 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
2d660 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2d670 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
2d680 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
2d690 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
2d6a0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
2d6b0 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
2d6c0 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
2d6d0 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
2d6e0 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
2d6f0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
2d700 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
2d710 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
2d720 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
2d730 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
2d740 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
2d750 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
2d760 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2d770 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2d780 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
2d790 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
2d7a0 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
2d7b0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
2d7c0 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
2d7d0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
2d7e0 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
2d7f0 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
2d800 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
2d810 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
2d820 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
2d830 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
2d840 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
2d850 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
2d860 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
2d870 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2d880 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2d890 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
2d8a0 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
2d8b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d8c0 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
2d8d0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2d8e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2d8f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d900 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
2d910 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
2d920 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
2d930 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2d940 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
2d950 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
2d960 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
2d970 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
2d980 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
2d990 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
2d9a0 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
2d9b0 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
2d9c0 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
2d9d0 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
2d9e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
2d9f0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
2da00 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
2da10 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
2da20 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
2da30 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
2da40 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
2da50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2da60 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
2da70 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2da80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2da90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2daa0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
2dab0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2dac0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
2dad0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2dae0 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f       if( pagerLo
2daf0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
2db00 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
2db10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2db20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
2db30 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
2db40 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
2db50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2db60 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
2db70 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72  siveMode ) pager
2db80 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
2db90 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
2dba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2dbb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
2dbc0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
2dbd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2dbe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a          /* The j
2dbf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2dc00 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
2dc10 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
2dc20 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20   reserved.      
2dc30 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65      ** or greate
2dc40 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
2dc50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77  tabase file. Now
2dc60 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   check that ther
2dc70 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  e is.          *
2dc80 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e  * at least one n
2dc90 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74  on-zero bytes at
2dca0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2dcb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2dcc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2dcd0 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77  there is, then w
2dce0 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  e consider this 
2dcf0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f  journal to be ho
2dd00 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20  t. If not, .    
2dd10 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
2dd20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
2dd30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2dd40 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
2dd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dd60 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
2dd70 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
2dd80 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2dd90 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
2dda0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2ddb0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2ddc0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
2ddd0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
2dde0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2ddf0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2de00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2de10 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
2de20 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
2de30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2de40 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
2de50 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
2de60 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
2de70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2de80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
2de90 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
2dea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2deb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2dec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ded0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2dee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2def0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2df00 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2df10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2df20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
2df30 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20   = (first!=0);. 
2df40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
2df50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
2df60 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
2df70 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
2df80 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72  annot open the r
2df90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
2dfa0 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
2dfb0 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20   see if.        
2dfc0 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61      ** its has a
2dfd0 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68   zero header, th
2dfe0 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  at might be due 
2dff0 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c  to an I/O error,
2e000 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20   or.            
2e010 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64  ** it might be d
2e020 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63  ue to the race c
2e030 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
2e040 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a  ed above and in.
2e050 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2e060 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69  icket #3883.  Ei
2e070 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65  ther way, assume
2e080 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2e090 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20  l is hot..      
2e0a0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
2e0b0 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70  ght be a false p
2e0c0 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66  ositive.  But if
2e0d0 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65   it is, then the
2e0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2e0f0 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61  automatic journa
2e100 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72  l playback and r
2e110 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73  ecovery mechanis
2e120 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20  m will deal.    
2e130 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
2e140 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c  it under an EXCL
2e150 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65  USIVE lock where
2e160 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
2e170 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  to.            *
2e180 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20  * worry so much 
2e190 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74  with race condit
2e1a0 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20  ions..          
2e1b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2e1c0 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20   *pExists = 1;. 
2e1d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e1e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2e1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e210 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2e220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2e230 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2e240 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  d to obtain a sh
2e250 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
2e260 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2e270 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
2e280 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
2e290 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75  PagerAcquire() u
2e2a0 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
2e2b0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
2e2c0 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
2e2d0 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
2e2e0 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
2e2f0 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
2e300 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
2e310 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
2e320 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2e330 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
2e340 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
2e350 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
2e360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2e370 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
2e380 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
2e390 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  tly in PAGER_OPE
2e3a0 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  N state (no lock
2e3b0 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
2e3c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e3d0 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
2e3e0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
2e3f0 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
2e400 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
2e410 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e420 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
2e430 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
2e440 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
2e450 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
2e460 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
2e470 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
2e480 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
2e490 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
2e4a0 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
2e4b0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
2e4c0 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
2e4d0 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
2e4e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2e4f0 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
2e500 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
2e510 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
2e520 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
2e530 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
2e540 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
2e550 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
2e560 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
2e570 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
2e580 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
2e590 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2e5a0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2e5b0 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
2e5c0 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
2e5d0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
2e5e0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2e5f0 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
2e600 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
2e610 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
2e620 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
2e630 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
2e640 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
2e650 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
2e660 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
2e670 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2e680 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
2e690 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
2e6a0 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
2e6b0 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
2e6c0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
2e6d0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2e6e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2e6f0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2e700 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
2e710 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
2e720 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
2e730 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
2e740 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2e750 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  .** rolling back
2e760 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
2e770 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
2e780 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
2e790 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e7a0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
2e7b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2e7c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2e7d0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2e7e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2e7f0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
2e800 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
2e810 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
2e820 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
2e830 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
2e840 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
2e850 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69  ages. This impli
2e860 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
2e870 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65  r state should e
2e880 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50  ither.  ** be OP
2e890 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45  EN or READER. RE
2e8a0 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADER is only pos
2e8b0 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67  sible if the pag
2e8c0 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20  er is or was in 
2e8d0 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  .  ** exclusive 
2e8e0 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a  access mode..  *
2e8f0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
2e900 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
2e910 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2e920 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  e)==0 );.  asser
2e930 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2e940 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2e950 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2e960 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2e970 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
2e980 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
2e990 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e  EADER );.  if( N
2e9a0 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50  EVER(MEMDB && pP
2e9b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2e9c0 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  { return pPager-
2e9d0 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69  >errCode; }..  i
2e9e0 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
2e9f0 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
2ea00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2ea10 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74  _OPEN ){.    int
2ea20 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31   bHotJournal = 1
2ea30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
2ea40 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ue if there exis
2ea50 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ts a hot journal
2ea60 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73  -file */..    as
2ea70 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
2ea80 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2ea90 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
2eaa0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2eab0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2eac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ead0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eae0 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
2eaf0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
2eb00 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
2eb10 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  );.      goto fa
2eb20 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
2eb30 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
2eb40 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
2eb50 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
2eb60 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
2eb70 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2eb80 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
2eb90 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
2eba0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
2ebb0 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
2ebc0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2ebd0 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  r->eLock<=SHARED
2ebe0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
2ebf0 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
2ec00 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a  l(pPager, &bHotJ
2ec10 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ournal);.    }. 
2ec20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ec30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
2ec40 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
2ec50 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75  .    if( bHotJou
2ec60 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
2ec70 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
2ec80 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
2ec90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
2eca0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
2ecb0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
2ecc0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
2ecd0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2ece0 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
2ecf0 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
2ed00 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
2ed10 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
2ed20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
2ed30 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
2ed40 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
2ed50 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
2ed60 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
2ed70 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
2ed80 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
2ed90 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
2eda0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
2edb0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
2edc0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
2edd0 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
2ede0 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
2edf0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
2ee00 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
2ee10 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
2ee20 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
2ee30 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
2ee40 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
2ee50 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
2ee60 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
2ee70 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
2ee80 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
2ee90 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
2eea0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
2eeb0 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
2eec0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
2eed0 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
2eee0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2eef0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2ef00 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   ** Unless the p
2ef10 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69  ager is in locki
2ef20 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2ef30 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  e mode, the lock
2ef40 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77   is.      ** dow
2ef50 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45  ngraded to SHARE
2ef60 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68  D_LOCK before th
2ef70 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2ef80 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rns..      */.  
2ef90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
2efa0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
2efb0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2efc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2efd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2efe0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2eff0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2f000 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
2f010 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74  ready open and t
2f020 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f  he file exists o
2f030 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65  n disk, open the
2f040 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
2f050 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
2f060 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20  e access. Write 
2f070 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72  access is requir
2f080 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20  ed because .    
2f090 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76    ** in exclusiv
2f0a0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
2f0b0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2f0c0 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
2f0d0 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  pen .      ** an
2f0e0 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  d possibly used 
2f0f0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
2f100 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f  n later on. Also
2f110 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a  , write-access .
2f120 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61        ** is usua
2f130 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  lly required to 
2f140 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
2f150 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  rnal in journal_
2f160 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20  mode=persist .  
2f170 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64      ** mode (and
2f180 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61   also for journa
2f190 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20  l_mode=truncate 
2f1a0 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29  on some systems)
2f1b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2f1c0 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   ** If the journ
2f1d0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
2f1e0 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
2f1f0 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
2f200 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
2f210 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
2f220 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
2f230 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
2f240 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  re .      ** thi
2f250 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
2f260 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
2f270 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
2f280 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  Or, it .      **
2f290 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
2f2a0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
2f2b0 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
2f2c0 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
2f2d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
2f2e0 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
2f2f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
2f300 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
2f310 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
2f320 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f330 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fd) ){.        s
2f340 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2f350 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2f360 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20  ->pVfs;.        
2f370 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20  int bExists;    
2f380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f390 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
2f3a0 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
2f3b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f3c0 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
2f3d0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
2f3e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
2f3f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2f400 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20  TS, &bExists);. 
2f410 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2f420 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
2f430 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sts ){.         
2f440 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
2f450 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2f460 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2f470 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
2f480 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
2f490 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2f4a0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
2f4b0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
2f4c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f4d0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2f4e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2f4f0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
2f500 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ut);.          a
2f510 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2f520 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
2f530 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
2f540 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2f550 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
2f560 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2f570 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
2f580 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f590 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2f5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2f5b0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2f5c0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2f5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f5e0 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
2f5f0 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
2f600 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2f610 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
2f620 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
2f630 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
2f640 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
2f650 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74  ad lock. Purge t
2f660 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a  he cache before.
2f670 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67        ** playing
2f680 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f   back the hot-jo
2f690 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65  urnal so that we
2f6a0 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69   don't end up wi
2f6b0 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
2f6c0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
2f6d0 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74  e.  Sync the hot
2f6e0 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f6f0 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a  playing.      **
2f700 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74   it back since t
2f710 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
2f720 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74  crashed and left
2f730 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
2f740 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
2f750 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20  ly did not sync 
2f760 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65  it and we are re
2f770 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73  quired to always
2f780 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74   sync.      ** t
2f790 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
2f7a0 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  e playing it bac
2f7b0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
2f7c0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
2f7d0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2f7e0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2f7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2f800 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2f810 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
2f820 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2f830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2f850 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
2f860 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
2f870 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2f880 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
2f890 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OPEN;.        }.
2f8a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2f8b0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
2f8c0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
2f8d0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28    pagerUnlockDb(
2f8e0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
2f8f0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OCK);.      }.. 
2f900 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f920 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2f930 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20   is taken if an 
2f940 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2f950 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  le trying to ope
2f960 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  n.        ** or 
2f970 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d  roll back a hot-
2f980 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f  journal while ho
2f990 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
2f9a0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
2f9b0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e       ** pager_un
2f9c0 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  lock() routine w
2f9d0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
2f9e0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74  fore returning t
2f9f0 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20  o unlock.       
2fa00 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66   ** the file. If
2fa10 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65   the unlock atte
2fa20 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  mpt fails, then 
2fa30 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74  Pager.eLock must
2fa40 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
2fa50 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
2fa60 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d  CK (see the comm
2fa70 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
2fa80 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20  efine for .     
2fa90 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f     ** UNKNOWN_LO
2faa0 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20  CK above for an 
2fab0 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20  explanation). . 
2fac0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2fad0 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
2fae0 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63   get pager_unloc
2faf0 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20  k() to do this, 
2fb00 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65  set Pager.eState
2fb10 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50   to.        ** P
2fb20 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20  AGER_ERROR now. 
2fb30 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
2fb40 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20  ally counted as 
2fb50 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20  a transition.   
2fb60 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52       ** to ERROR
2fb70 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74   state in the st
2fb80 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74  ate diagram at t
2fb90 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
2fba0 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
2fbb0 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
2fbc0 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c  at the same call
2fbd0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
2fbe0 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20  () will very.   
2fbf0 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20       ** shortly 
2fc00 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70  transition the p
2fc10 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  ager object to t
2fc20 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43  he OPEN state. C
2fc30 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  alling.        *
2fc40 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  * assert_pager_s
2fc50 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69  tate() would fai
2fc60 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f  l now, as it sho
2fc70 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
2fc80 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ble.        ** t
2fc90 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74  o be in ERROR st
2fca0 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61  ate when there a
2fcb0 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64  re zero outstand
2fcc0 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20  ing page .      
2fcd0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e    ** references.
2fce0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fcf0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
2fd00 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
2fd10 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
2fd20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2fd30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fd40 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2fd50 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PEN );.      ass
2fd60 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
2fd70 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
2fd80 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
2fd90 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
2fda0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
2fdb0 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ->eLock>SHARED_L
2fdc0 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  OCK).      );.  
2fdd0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
2fde0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a  ager->tempFile .
2fdf0 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
2fe00 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69  >pBackup || sqli
2fe10 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
2fe20 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2fe30 68 65 29 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20  he)>0) .    ){. 
2fe40 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
2fe50 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
2fe60 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
2fe70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2fe80 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
2fe90 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
2fea0 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
2feb0 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
2fec0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
2fed0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
2fee0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
2fef0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2ff00 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
2ff10 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
2ff20 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
2ff30 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
2ff40 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
2ff50 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
2ff60 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2ff70 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
2ff80 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
2ff90 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
2ffa0 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
2ffb0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
2ffc0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
2ffd0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
2ffe0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
2fff0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
30000 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
30010 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
30020 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
30030 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
30040 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
30050 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
30060 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
30070 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
30080 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
30090 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
300a0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
300b0 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
300c0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
300d0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
300e0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
300f0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
30100 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
30110 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
30120 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
30130 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
30140 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
30150 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
30160 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  no nPage = 0;.  
30170 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
30180 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
30190 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
301a0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
301b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
301c0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
301d0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
301e0 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20   failed;..      
301f0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
30200 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
30210 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
30220 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
30230 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
30240 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30250 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
30260 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
30270 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
30280 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
30290 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
302a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
302b0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
302c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
302d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
302e0 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
302f0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
30300 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
30310 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
30320 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
30330 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
30340 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
30350 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
30360 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
30370 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
30380 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
30390 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
303a0 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
303b0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
303c0 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
303d0 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
303e0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
303f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
30400 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
30410 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
30420 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
30430 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
30440 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ger);.#ifndef SQ
30450 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
30460 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30470 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
30480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
30490 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
304a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
304b0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
304c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
304d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
304e0 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
304f0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
30500 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
30510 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
30520 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
30530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
30540 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
30550 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
30560 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
30570 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
30580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30590 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
305a0 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
305b0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
305c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
305d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
305e0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
305f0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
30600 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
30610 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  EADER;.  }.  ret
30620 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30630 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
30640 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
30650 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
30660 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
30670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
30680 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
30690 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
306a0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
306b0 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
306c0 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
306d0 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
306e0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
306f0 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
30700 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
30710 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
30720 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
30730 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
30740 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
30750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
30760 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
30770 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30780 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50  .  if( (sqlite3P
30790 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
307a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
307b0 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  0) ){.    pagerU
307c0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
307d0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
307e0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
307f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
30800 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
30810 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
30820 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
30830 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
30840 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
30850 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
30860 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
30870 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
30880 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
30890 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
308a0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
308b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
308c0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
308d0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
308e0 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
308f0 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
30900 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
30910 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
30920 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
30930 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
30940 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
30950 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
30960 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
30970 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
30980 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
30990 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
309a0 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
309b0 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
309c0 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
309d0 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
309e0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
309f0 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
30a00 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
30a10 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
30a20 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
30a30 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
30a40 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
30a50 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
30a60 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
30a70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
30a80 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
30a90 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
30aa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30ab0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
30ac0 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
30ad0 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
30ae0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
30af0 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
30b00 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
30b10 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
30b20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
30b30 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
30b40 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
30b50 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
30b60 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
30b70 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
30b80 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
30b90 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
30ba0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
30bb0 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
30bc0 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
30bd0 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
30be0 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
30bf0 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
30c00 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
30c10 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
30c20 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
30c30 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
30c40 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
30c50 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
30c60 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
30c70 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
30c80 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
30c90 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
30ca0 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e  wo seperate scen
30cb0 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
30cc0 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
30cd0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
30ce0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
30cf0 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
30d00 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
30d10 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
30d20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
30d30 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
30d40 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
30d50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
30d60 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
30d70 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
30d80 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
30d90 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
30da0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
30db0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
30dc0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
30dd0 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
30de0 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
30df0 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
30e00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
30e10 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
30e20 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
30e30 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
30e40 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
30e50 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
30e60 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
30e70 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
30e80 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
30e90 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
30ea0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
30eb0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
30ec0 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
30ed0 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
30ee0 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
30ef0 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
30f00 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
30f10 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
30f20 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
30f30 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
30f40 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
30f50 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
30f60 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
30f70 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
30f80 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
30f90 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
30fa0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
30fb0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
30fc0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
30fd0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
30fe0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
30ff0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
31000 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
31010 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
31020 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
31030 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
31040 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
31050 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
31060 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
31070 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
31080 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
31090 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
310a0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
310b0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
310c0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
310d0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
310e0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
310f0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
31100 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
31110 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
31120 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
31130 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
31140 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
31150 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
31160 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
31170 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
31180 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
31190 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
311a0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
311b0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
311c0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
311d0 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
311e0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
311f0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
31200 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
31210 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
31220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
31230 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
31240 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31250 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
31260 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
31270 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
31280 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
31290 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
312a0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
312b0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
312c0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
312d0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
312e0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
312f0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
31300 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
31310 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
31320 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
31330 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
31340 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
31350 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
31360 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
31370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
31380 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
31390 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
313a0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
313b0 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
313c0 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
313d0 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
313e0 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
313f0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
31400 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
31410 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
31420 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
31430 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
31440 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
31450 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
31460 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
31470 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
31480 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20  Cache, pgno, 1, 
31490 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  ppPage);.  }..  
314a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
314b0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
314c0 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
314d0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
314e0 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20  h() returned an 
314f0 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20  error or the.   
31500 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c   ** pager was al
31510 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
31520 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
31530 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
31540 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53  called..    ** S
31550 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20  et pPg to 0 and 
31560 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65  jump to the exce
31570 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20  ption handler.  
31580 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  */.    pPg = 0;.
31590 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
315a0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a  cquire_err;.  }.
315b0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
315c0 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
315d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
315e0 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
315f0 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61  pPager || (*ppPa
31600 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  ge)->pPager==0 )
31610 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  ;..  if( (*ppPag
31620 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  e)->pPager && !n
31630 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
31640 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
31650 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
31660 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
31670 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
31680 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
31690 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
316a0 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
316b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
316c0 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
316d0 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
316e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
316f0 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
31700 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
31710 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20  TAT_HIT]++;.    
31720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31730 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
31740 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
31750 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
31760 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
31770 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
31780 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
31790 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20  alized.  */..   
317a0 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a   pPg = *ppPage;.
317b0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
317c0 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
317d0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
317e0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
317f0 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
31800 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
31810 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
31820 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
31830 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
31840 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
31850 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
31860 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
31870 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
31880 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
31890 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
318a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
318b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
318c0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
318d0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
318e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   }..    if( MEMD
318f0 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  B || pPager->dbS
31900 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f  ize<pgno || noCo
31910 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e  ntent || !isOpen
31920 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
31930 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
31940 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
31950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31960 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
31970 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
31980 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
31990 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
319a0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
319b0 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
319c0 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
319d0 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
319e0 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
319f0 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
31a00 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
31a10 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
31a20 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
31a30 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
31a40 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
31a50 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
31a60 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
31a70 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
31a80 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
31a90 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
31aa0 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
31ab0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
31ac0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
31ad0 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
31ae0 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
31af0 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
31b00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
31b10 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
31b20 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
31b30 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
31b40 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
31b50 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
31b60 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
31b70 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
31b80 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
31b90 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
31ba0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
31bb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
31bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31bd0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
31be0 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
31bf0 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
31c00 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
31c10 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
31c20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
31c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
31c40 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
31c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
31c60 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
31c70 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
31c80 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
31c90 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
31ca0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
31cb0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
31cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31cd0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
31ce0 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  er );.      pPag
31cf0 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
31d00 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20  STAT_MISS]++;.  
31d10 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
31d20 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
31d30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31d40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
31d50 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
31d60 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
31d70 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
31d80 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
31d90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
31da0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
31db0 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
31dc0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
31dd0 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
31de0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
31df0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
31e00 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
31e10 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
31e20 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
31e30 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
31e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
31e50 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
31e60 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
31e70 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
31e80 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
31e90 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
31ea0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
31eb0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
31ec0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
31ed0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
31ee0 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
31ef0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
31f00 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
31f10 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
31f20 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
31f30 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
31f40 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
31f50 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
31f60 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
31f70 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
31f80 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
31f90 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
31fa0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
31fb0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
31fc0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
31fd0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
31fe0 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
31ff0 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
32000 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
32010 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
32020 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
32030 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
32040 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
32050 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
32060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
32070 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
32080 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno!=0 );.  asse
32090 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61  rt( pPager->pPCa
320a0 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  che!=0 );.  asse
320b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
320c0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
320d0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
320e0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
320f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
32100 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
32110 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
32120 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72  , &pPg);.  retur
32130 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
32140 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
32150 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
32160 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
32170 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
32180 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
32190 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
321a0 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
321b0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
321c0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
321d0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
321e0 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
321f0 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
32200 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
32210 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
32220 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
32230 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
32240 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
32250 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
32260 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72  pPg ){.    Pager
32270 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
32280 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  pPager;.    sqli
32290 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
322a0 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72  (pPg);.    pager
322b0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
322c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
322d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
322e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
322f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
32300 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
32310 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
32320 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
32330 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
32340 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
32350 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
32360 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
32370 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
32380 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
32390 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
323a0 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
323b0 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
323c0 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
323d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
323e0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
323f0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
32400 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
32410 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
32420 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
32430 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
32440 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
32450 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
32460 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
32470 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
32480 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
32490 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
324a0 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
324b0 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
324c0 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
324d0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
324e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
324f0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
32500 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
32510 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
32520 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
32530 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
32540 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
32550 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
32560 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
32570 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
32580 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
32590 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
325a0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
325b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
325c0 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
325d0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
325e0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
325f0 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
32600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
32610 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
32620 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
32630 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
32640 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
32650 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
32660 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
32670 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
32680 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
32690 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
326a0 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
326b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
326c0 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
326d0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
326e0 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
326f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
32700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
32710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32720 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
32730 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
32740 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
32750 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
32760 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
32770 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
32780 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
32790 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
327a0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
327b0 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
327c0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
327d0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
327e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
327f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
32800 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
32810 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
32820 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
32830 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
32840 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
32850 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
32860 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
32870 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
32880 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
32890 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
328a0 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
328b0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
328c0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
328d0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
328e0 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
328f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
32900 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
32910 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
32920 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
32930 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
32940 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
32950 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
32960 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
32970 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
32980 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
32990 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
329a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
329b0 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
329c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
329d0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
329e0 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
329f0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
32a00 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
32a10 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
32a20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
32a30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
32a40 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
32a50 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
32a60 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
32a70 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
32a80 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
32a90 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
32aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32ab0 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
32ac0 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
32ad0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  */.          SQL
32ae0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
32af0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
32b00 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
32b10 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
32b20 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  le ? .          
32b30 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
32b40 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
32b50 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
32b60 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
32b70 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
32b80 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
32b90 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69           );.  #i
32ba0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
32bb0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
32bc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32bd0 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
32be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
32bf0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
32c00 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
32c10 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
32c20 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
32c30 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c          );.  #el
32c40 73 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  se.        rc = 
32c50 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
32c60 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
32c70 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
32c80 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  d, flags, 0);.  
32c90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
32ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
32cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
32cc0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
32cd0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
32ce0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
32cf0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
32d00 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
32d10 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
32d20 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
32d30 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
32d40 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
32d50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
32d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32d70 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
32d80 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
32d90 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
32da0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
32db0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
32dc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
32dd0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
32de0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
32df0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
32e00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
32e10 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
32e20 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
32e30 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
32e40 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
32e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32e60 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
32e70 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
32e80 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
32e90 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
32ea0 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
32eb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
32ec0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32ed0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
32ee0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
32ef0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
32f00 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a  RITER_CACHEMOD;.
32f10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
32f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
32f30 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
32f40 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
32f50 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
32f60 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
32f70 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
32f80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
32f90 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
32fa0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
32fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
32fc0 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
32fd0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63  s false, then ac
32fe0 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
32ff0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
33000 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
33010 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
33020 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
33030 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
33040 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
33050 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
33060 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
33070 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
33080 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
33090 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
330a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
330b0 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
330c0 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
330d0 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
330e0 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
330f0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
33100 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
33110 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
33120 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
33130 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
33140 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
33150 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
33160 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
33170 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
33180 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
33190 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
331a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
331b0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
331c0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
331d0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
331e0 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
331f0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
33200 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
33210 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
33220 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
33230 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
33240 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
33250 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
33260 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
33270 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
33280 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33290 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
332a0 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
332b0 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
332c0 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
332d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
332e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
332f0 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
33300 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
33310 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
33320 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
33330 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
33340 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
33350 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
33360 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
33370 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
33380 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
33390 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
333a0 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){.  
333b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
333c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
333d0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
333e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
333f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
33400 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
33410 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
33420 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
33430 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
33440 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
33450 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
33460 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
33470 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
33480 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
33490 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
334a0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
334b0 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
334c0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
334d0 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
334e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
334f0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
33500 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
33510 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
33520 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33530 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
33540 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
33550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
33560 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
33570 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
33580 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
33590 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
335a0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
335b0 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
335c0 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
335d0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
335e0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
335f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
33600 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
33610 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
33620 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
33630 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
33640 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
33650 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
33660 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
33670 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
33680 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
33690 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
336a0 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
336b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
336c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
336d0 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61  BeginWriteTransa
336e0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
336f0 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
33700 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
33710 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
33720 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
33730 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
33740 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
33750 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
33760 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
33770 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
33780 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
33790 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
337a0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
337b0 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
337c0 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
337d0 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
337e0 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
337f0 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
33800 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
33810 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
33820 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
33830 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
33840 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
33850 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
33860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
33870 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
33880 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
33890 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
338a0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
338b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
338c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
338d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
338e0 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
338f0 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
33900 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
33910 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
33920 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
33930 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
33940 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
33950 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
33960 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
33970 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
33980 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
33990 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
339a0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
339b0 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
339c0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
339d0 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
339e0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
339f0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
33a00 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
33a10 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
33a20 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
33a30 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
33a40 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
33a50 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
33a60 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
33a70 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
33a80 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
33a90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
33aa0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
33ab0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
33ac0 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
33ad0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
33ae0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
33af0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
33b00 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
33b10 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
33b20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
33b30 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
33b40 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
33b50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
33b60 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
33b70 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
33b80 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
33b90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
33ba0 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
33bb0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
33bc0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
33bd0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
33be0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
33bf0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33c00 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33c10 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
33c20 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
33c30 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
33c40 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
33c50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33c60 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
33c70 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
33c80 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
33c90 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
33ca0 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
33cb0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
33cc0 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
33cd0 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
33ce0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
33cf0 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
33d00 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
33d10 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
33d20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
33d30 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
33d40 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
33d50 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
33d60 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
33d70 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
33d80 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
33d90 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
33da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
33db0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
33dc0 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
33dd0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
33de0 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
33df0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
33e00 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
33e10 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68  ITE_OK;..  /* Th
33e20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
33e30 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20  t called unless 
33e40 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
33e50 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
33e60 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74  .  ** been start
33e70 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  ed. The journal 
33e80 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
33e90 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74  not be open at t
33ea0 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
33eb0 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  It is never call
33ec0 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ed in the ERROR 
33ed0 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  state..  */.  as
33ee0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
33ef0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
33f00 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
33f10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
33f20 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
33f30 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
33f40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
33f50 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
33f60 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
33f70 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
33f80 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
33f90 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
33fa0 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
33fb0 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
33fc0 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ed, report the s
33fd0 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61  ame error.  ** a
33fe0 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c  gain. This shoul
33ff0 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75  d not happen, bu
34000 74 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76  t the check prov
34010 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e  ides robustness.
34020 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
34030 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
34040 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65   )  return pPage
34050 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
34060 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  * Higher-level r
34070 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61  outines never ca
34080 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
34090 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
340a0 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c  not.  ** writabl
340b0 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e  e.  But check an
340c0 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72  yway, just for r
340d0 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20  obustness. */.  
340e0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
340f0 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65  ->readOnly) ) re
34100 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
34110 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
34120 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  pPg);..  /* The 
34130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
34140 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e  ds to be opened.
34150 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
34160 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65  utines have alre
34170 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65  ady.  ** obtaine
34180 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
34190 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74  locks to begin t
341a0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
341b0 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20  tion, but the.  
341c0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
341d0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
341e0 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20  t be open. Open 
341f0 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69  it now if this i
34200 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a  s the case..  **
34210 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f  .  ** This is do
34220 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ne before callin
34230 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
34240 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68  akeDirty() on th
34250 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74  e page. .  ** Ot
34260 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77  herwise, if it w
34270 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63  ere done after c
34280 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63  alling sqlite3Pc
34290 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c  acheMakeDirty(),
342a0 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72   then.  ** an er
342b0 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20  ror might occur 
342c0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f  and the pager wo
342d0 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52  uld end up in WR
342e0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
342f0 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65  e.  ** with page
34300 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
34310 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  y in the cache..
34320 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
34330 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
34340 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
34350 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
34360 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
34370 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
34380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
34390 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
343a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
343b0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
343c0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
343d0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
343e0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
343f0 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ager) );..  /* M
34400 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
34410 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
34420 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
34430 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
34440 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
34450 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
34460 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
34470 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
34480 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
34490 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
344a0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
344b0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
344c0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73  e(pPg) ){.    as
344d0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
344e0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
344f0 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
34500 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
34510 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
34520 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
34530 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
34540 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
34550 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
34560 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
34570 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
34580 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
34590 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
345a0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
345b0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
345c0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
345d0 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
345e0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70  urnal(pPg) && !p
345f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
34600 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r) ){.      asse
34610 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
34620 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
34630 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
34640 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
34650 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28  gSize && isOpen(
34660 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
34670 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
34680 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
34690 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20  *pData2;.       
346a0 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
346b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
346c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
346d0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
346e0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
346f0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
34700 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
34710 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
34720 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
34730 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
34740 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
34750 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
34760 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
34770 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
34780 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
34790 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  O(pPager) );..  
347a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
347b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
347c0 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
347d0 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20  lOff );.        
347e0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
347f0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
34800 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
34810 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
34820 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
34830 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
34840 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
34850 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  2);..        /* 
34860 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
34870 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
34880 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
34890 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
348a0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
348b0 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
348c0 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
348d0 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
348e0 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
348f0 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
34900 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34910 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
34920 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
34930 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
34940 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
34950 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
34960 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
34970 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
34980 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
34990 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
349a0 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
349b0 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
349c0 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
349d0 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
349e0 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
349f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34a00 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
34a10 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a  HDR_NEED_SYNC;..
34a20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
34a30 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
34a40 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
34a50 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
34a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34a70 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
34a80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34a90 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
34aa0 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
34ab0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34ac0 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20  , iOff+4);.     
34ad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34ae0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
34af0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
34b00 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
34b10 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61  r->jfd, iOff+pPa
34b20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
34b30 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
34b40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34b50 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
34b60 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
34b70 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
34b80 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
34b90 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
34ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
34bb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
34bc0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
34bd0 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
34be0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
34bf0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
34c00 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
34c10 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
34c20 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
34c30 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
34c40 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
34c50 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
34c60 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
34c70 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
34c80 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
34c90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
34ca0 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
34cb0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
34cc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
34cd0 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70  rnalOff += 8 + p
34ce0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
34cf0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
34d00 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
34d10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34d20 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
34d30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
34d40 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
34d50 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
34d60 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
34d70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34d80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34d90 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EM );.        as
34da0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
34db0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
34dc0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
34dd0 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61     rc |= addToSa
34de0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
34df0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
34e00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34e10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34e20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
34e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34e40 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EM );.          
34e50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
34e60 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
34e70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
34e80 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
34e90 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
34ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
34eb0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
34ec0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
34ed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
34ee0 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45  AGERTRACE(("APPE
34ef0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
34f00 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
34f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
34f20 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
34f30 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
34f40 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
34f50 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
34f60 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20  _SYNC)?1:0)));. 
34f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
34f80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
34f90 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
34fa0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
34fb0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
34fc0 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
34fd0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
34fe0 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
34ff0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
35000 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
35010 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
35020 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
35030 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
35040 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
35050 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
35060 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
35070 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
35080 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
35090 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62    */.    if( sub
350a0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
350b0 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  g) ){.      rc =
350c0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
350d0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
350e0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
350f0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
35100 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
35110 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
35120 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
35130 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
35140 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
35150 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
35160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
35170 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
35180 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20  writeable. This 
35190 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
351a0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a  called before .*
351b0 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  * making changes
351c0 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20   to a page. The 
351d0 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63  caller must chec
351e0 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  k the return val
351f0 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66  ue .** of this f
35200 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63  unction and be c
35210 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68  areful not to ch
35220 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
35230 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68  ta unless .** th
35240 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
35250 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
35260 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
35270 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
35280 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
35290 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
352a0 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
352b0 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
352c0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
352d0 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
352e0 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
352f0 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
35300 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
35310 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
35320 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
35330 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
35340 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
35350 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
35360 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
35370 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
35380 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e  occurs, SQLITE_N
35390 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
353a0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
353b0 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f  rned.** as appro
353c0 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73  priate. Otherwis
353d0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
353e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
353f0 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
35400 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
35410 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
35420 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
35430 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
35440 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
35450 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
35460 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
35470 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
35480 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
35490 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ize);..  assert(
354a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
354b0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
354c0 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
354d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
354e0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
354f0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
35500 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
35510 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
35520 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
35530 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
35540 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
35550 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
35560 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
35570 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
35580 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
35590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
355a0 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
355b0 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
355c0 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
355d0 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30     int nPage = 0
355e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
355f0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
35600 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
35610 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
35620 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
35630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
35640 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
35650 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
35660 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
35670 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65  True if any page
35680 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f   has PGHDR_NEED_
35690 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  SYNC */..    /* 
356a0 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
356b0 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31  cSpill flag to 1
356c0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
356d0 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
356e0 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e  w.    ** a journ
356f0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  al header to be 
35700 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
35710 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
35720 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  led by.    ** th
35730 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
35740 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35750 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
35760 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
35770 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20  NotSyncSpill==0 
35780 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
35790 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b  oNotSyncSpill++;
357a0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
357b0 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
357c0 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
357d0 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
357e0 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
357f0 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
35800 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
35810 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
35820 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
35830 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
35840 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
35850 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
35860 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
35870 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
35880 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
35890 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
358a0 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75  1;..    nPageCou
358b0 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  nt = pPager->dbS
358c0 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50 67  ize;.    if( pPg
358d0 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
358e0 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
358f0 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
35900 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  pg1)+1;.    }els
35910 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
35920 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
35930 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
35940 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f   nPage = nPageCo
35950 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d  unt+1-pg1;.    }
35960 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
35970 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74  e = nPagePerSect
35980 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
35990 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20  sert(nPage>0);. 
359a0 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70     assert(pg1<=p
359b0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
359c0 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
359d0 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
359e0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
359f0 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c  nPage && rc==SQL
35a00 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
35a10 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70       Pgno pg = p
35a20 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48  g1+ii;.      PgH
35a30 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20  dr *pPage;.     
35a40 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67   if( pg==pPg->pg
35a50 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69  no || !sqlite3Bi
35a60 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
35a70 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29  >pInJournal, pg)
35a80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
35a90 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  pg!=PAGER_MJ_PGN
35aa0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
35ab0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35ac0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
35ad0 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b  er, pg, &pPage);
35ae0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
35af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35b00 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
35b10 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61   pager_write(pPa
35b20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
35b30 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
35b40 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
35b50 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  C ){.           
35b60 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
35b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
35b80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
35b90 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
35ba0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.          }
35bb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35bc0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67   }else if( (pPag
35bd0 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
35be0 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30  (pPager, pg))!=0
35bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
35c00 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
35c10 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
35c20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
35c30 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
35c40 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
35c50 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
35c60 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
35c70 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
35c80 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
35c90 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
35ca0 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67   any of the nPag
35cb0 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
35cc0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c  starting at pg1,
35cd0 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74   then it needs t
35ce0 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c  o be set for all
35cf0 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73   of them. Becaus
35d00 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67  e.    ** writing
35d10 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65   to any of these
35d20 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79   nPage pages may
35d30 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65   damage the othe
35d40 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  rs, the.    ** j
35d50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
35d60 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65   contain sync()e
35d70 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  d copies of all 
35d80 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62  of them.    ** b
35d90 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
35da0 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  m can be written
35db0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
35dc0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
35dd0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
35de0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53  LITE_OK && needS
35df0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
35e00 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
35e10 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
35e20 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  i<nPage; ii++){.
35e30 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
35e40 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
35e50 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
35e60 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
35e70 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20   pPage ){.      
35e80 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73      pPage->flags
35e90 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
35ea0 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  YNC;.          s
35eb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35ec0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
35ed0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
35ee0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
35ef0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
35f00 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70  pill==1 );.    p
35f10 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
35f20 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65  Spill--;.  }else
35f30 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
35f40 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  _write(pDbPage);
35f50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
35f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
35f70 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
35f80 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
35f90 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
35fa0 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
35fb0 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
35fc0 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
35fd0 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
35fe0 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
35ff0 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
36000 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
36010 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
36020 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
36030 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36040 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
36050 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
36060 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
36070 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  IRTY;.}.#endif..
36080 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
36090 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
360a0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
360b0 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
360c0 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
360d0 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
360e0 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61  n on page pPg ba
360f0 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
36100 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
36110 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
36120 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
36130 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  y.  This happens
36140 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
36150 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  hen.** the page 
36160 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61  has been added a
36170 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20  s a leaf of the 
36180 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20  freelist and so 
36190 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e  its.** content n
361a0 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73  o longer matters
361b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
361c0 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
361d0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
361e0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
361f0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
36200 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
36210 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65  e is unused. The
36220 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
36230 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
36240 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
36250 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
36260 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
36270 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
36280 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
36290 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65  on can quadruple
362a0 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
362b0 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f  rge .** DELETE o
362c0 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f  perations..*/.vo
362d0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
362e0 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a  ontWrite(PgHdr *
362f0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
36300 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36310 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d  ger;.  if( (pPg-
36320 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
36330 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  TY) && pPager->n
36340 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a  Savepoint==0 ){.
36350 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
36360 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
36370 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
36380 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
36390 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
363a0 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
363b0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
363c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
363d0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
363e0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
363f0 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  ;.    pager_set_
36400 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
36410 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
36420 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
36430 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
36440 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
36450 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
36460 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
36470 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34  r, stored as a 4
36480 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
36490 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e   integer startin
364a0 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66  g at .** byte of
364b0 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70  fset 24 of the p
364c0 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65 20  ager file.  The 
364d0 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67 65  secondary change
364e0 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a 20 39   counter at.** 9
364f0 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65  2 is also update
36500 64 2c 20 61 73 20 69 73 20 74 68 65 20 53 51 4c  d, as is the SQL
36510 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
36520 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e  er at offset 96.
36530 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69 73 20  .**.** But this 
36540 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
36550 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
36560 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
36570 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 54 6f   is false..** To
36580 20 61 76 6f 69 64 20 65 78 63 65 73 73 20 63 68   avoid excess ch
36590 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 31  urning of page 1
365a0 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f 6e 6c  , the update onl
365b0 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 0a  y happens once..
365c0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
365d0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
365e0 67 65 63 6f 75 6e 74 65 72 28 29 20 72 6f 75 74  gecounter() rout
365f0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 61 6e  ine that does an
36600 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e   .** uncondition
36610 61 6c 20 75 70 64 61 74 65 20 6f 66 20 74 68 65  al update of the
36620 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 73   change counters
36630 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
36640 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
36650 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
36660 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63  his is done by c
36670 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
36680 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
36690 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d  n page 1, then m
366a0 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
366b0 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
366c0 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68  page data. In th
366d0 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65  is case the file
366e0 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
366f0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
36700 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
36710 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
36720 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63  *.** The isDirec
36730 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f  tMode flag may o
36740 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  nly be non-zero 
36750 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77  if the library w
36760 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77  as compiled.** w
36770 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45  ith the SQLITE_E
36780 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
36790 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  TE macro defined
367a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
367b0 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69  ** if isDirect i
367c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
367d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
367e0 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69  le is updated di
367f0 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69  rectly.** by wri
36800 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20  ting an updated 
36810 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
36820 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  1 using a call t
36830 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  o the .** sqlite
36840 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74  3OsWrite() funct
36850 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
36860 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
36870 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
36880 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
36890 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20  sDirectMode){.  
368a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
368b0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
368c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
368d0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
368e0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
368f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36900 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
36910 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
36920 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
36930 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
36940 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64    /* Declare and
36950 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73   initialize cons
36960 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73  tant integer 'is
36970 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a  Direct'. If the.
36980 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74    ** atomic-writ
36990 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
369a0 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69  s enabled in thi
369b0 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73  s build, then is
369c0 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69  Direct.  ** is i
369d0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
369e0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
369f0 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  s the isDirectMo
36a00 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  de parameter.  *
36a10 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
36a20 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  on. Otherwise, i
36a30 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  t is always set 
36a40 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
36a50 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
36a60 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69  hat if the atomi
36a70 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
36a80 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  tion is not.  **
36a90 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
36aa0 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f  ile time, the co
36ab0 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20  mpiler can omit 
36ac0 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a  the tests of.  *
36ad0 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c  * 'isDirect' bel
36ae0 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74  ow, as well as t
36af0 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65  he block enclose
36b00 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69  d in the.  ** "i
36b10 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63  f( isDirect )" c
36b20 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  ondition..  */.#
36b30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
36b40 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
36b50 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  E.# define DIREC
36b60 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72  T_MODE 0.  asser
36b70 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d  t( isDirectMode=
36b80 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
36b90 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63  ARAMETER(isDirec
36ba0 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20  tMode);.#else.# 
36bb0 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
36bc0 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a  DE isDirectMode.
36bd0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70  #endif..  if( !p
36be0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
36bf0 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72  ntDone && pPager
36c00 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
36c10 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
36c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c30 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
36c40 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 20 20 61  page 1 */..    a
36c50 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
36c60 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70  tempFile && isOp
36c70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
36c80 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ;..    /* Open p
36c90 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
36ca0 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
36cb0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
36cc0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
36cd0 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
36ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48      assert( pPgH
36cf0 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  dr==0 || rc==SQL
36d00 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
36d10 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61  * If page one wa
36d20 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73  s fetched succes
36d30 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73  sfully, and this
36d40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
36d50 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  .    ** operatin
36d60 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65  g in direct-mode
36d70 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72  , make page 1 wr
36d80 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f  itable.  When no
36d90 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72  t in .    ** dir
36da0 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31  ect mode, page 1
36db0 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
36dc0 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e  in cache and hen
36dd0 63 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28  ce the PagerGet(
36de0 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69  ).    ** above i
36df0 73 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73  s always success
36e00 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20  ful - hence the 
36e10 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51  ALWAYS on rc==SQ
36e20 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a  LITE_OK..    */.
36e30 20 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f      if( !DIRECT_
36e40 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72  MODE && ALWAYS(r
36e50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  c==SQLITE_OK) ){
36e60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
36e70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
36e80 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  gHdr);.    }..  
36e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
36eb0 41 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65 20  Actually do the 
36ec0 75 70 64 61 74 65 20 6f 66 20 74 68 65 20 63 68  update of the ch
36ed0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange counter */.
36ee0 20 20 20 20 20 20 70 61 67 65 72 5f 77 72 69 74        pager_writ
36ef0 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
36f00 70 50 67 48 64 72 29 3b 0a 0a 20 20 20 20 20 20  pPgHdr);..      
36f10 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  /* If running in
36f20 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72   direct mode, wr
36f30 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
36f40 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68   of page 1 to th
36f50 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
36f60 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45   if( DIRECT_MODE
36f70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
36f80 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20  t void *zBuf;.  
36f90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
36fa0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
36fb0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  >0 );.        CO
36fc0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
36fd0 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36  Hdr->pData, 1, 6
36fe0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
36ff0 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  M, zBuf);.      
37000 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
37020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
37030 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
37040 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
37050 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
37060 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
37070 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
37080 57 52 49 54 45 5d 2b 2b 3b 0a 20 20 20 20 20 20  WRITE]++;.      
37090 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
370a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
370b0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
370c0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
370d0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
370e0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
370f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
37100 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
37110 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
37120 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
37130 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
37140 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
37150 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
37160 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
37170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37180 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
37190 61 73 65 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ase file to disk
371a0 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
371b0 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
371c0 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 6f 72 20  databases.** or 
371d0 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
371e0 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
371f0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
37200 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
37210 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
37220 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  er for which it 
37230 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73  is a no-op, this
37240 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
37250 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
37260 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f  Otherwise, an IO
37270 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
37280 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
37290 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
372a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
372b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
372c0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
372d0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
372e0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
372f0 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  DB );.    rc = s
37300 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
37310 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
37320 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 7d  >syncFlags);.  }
37330 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28  else if( isOpen(
37340 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
37350 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
37360 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  B );.    rc = sq
37370 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
37380 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
37390 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43  QLITE_FCNTL_SYNC
373a0 5f 4f 4d 49 54 54 45 44 2c 20 30 29 3b 0a 20 20  _OMITTED, 0);.  
373b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
373c0 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
373d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
373e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
373f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37400 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37410 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
37420 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72 69 74  led while a writ
37430 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
37440 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f   active in.** ro
37450 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63  llback. If the c
37460 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
37470 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  WAL mode, this c
37480 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  all is a no-op. 
37490 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
374a0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
374b0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
374c0 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53  y have an EXCLUS
374d0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  IVE lock on .** 
374e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
374f0 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  e, an attempt is
37500 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
37510 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  one..**.** If th
37520 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
37530 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
37540 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74 20   or the attempt 
37550 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a  to obtain it is.
37560 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  ** successful, o
37570 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  r the connection
37580 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
37590 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
375a0 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
375b0 77 69 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c  wise, either SQL
375c0 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53  ITE_BUSY or an S
375d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
375e0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
375f0 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  * returned..*/.i
37600 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  nt sqlite3PagerE
37610 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67  xclusiveLock(Pag
37620 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
37630 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37640 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
37650 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37660 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37670 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  OD .       || pP
37680 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37690 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
376a0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
376b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
376c0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
376d0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
376e0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
376f0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37700 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57  if( 0==pagerUseW
37710 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
37720 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
37730 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
37740 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
37750 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
37760 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
37770 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
37780 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
37790 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
377a0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
377b0 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
377c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
377d0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
377e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
377f0 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
37800 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
37810 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
37820 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
37830 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
37840 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
37850 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
37860 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
37870 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
37880 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a  ne ensures that:
37890 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
378a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
378b0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75  nge-counter is u
378c0 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74  pdated,.**   * t
378d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
378e0 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65  nced (unless the
378f0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
37900 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
37910 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20  ed),.**   * all 
37920 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20  dirty pages are 
37930 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
37940 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a  atabase file, .*
37950 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
37960 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  se file is trunc
37970 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65  ated (if require
37980 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  d), and.**   * t
37990 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
379a0 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
379b0 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
379c0 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  hat remains to c
379d0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
379e0 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61  ction is to fina
379f0 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65  lize .** (delete
37a00 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  , truncate or ze
37a10 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72  ro the first par
37a20 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61  t of) the journa
37a30 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64  l file (or .** d
37a40 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
37a50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
37a60 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
37a70 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
37a80 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
37a90 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
37aa0 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
37ab0 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
37ac0 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
37ad0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
37ae0 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
37af0 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61   If the final pa
37b00 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63  rameter - noSync
37b10 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e   - is true, then
37b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37b30 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20  le itself.** is 
37b40 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20  not synced. The 
37b50 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c  caller must call
37b60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
37b70 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a  c() directly to.
37b80 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  ** sync the data
37b90 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
37ba0 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50   calling CommitP
37bb0 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c  haseTwo() to del
37bc0 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ete the.** journ
37bd0 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  al file in this 
37be0 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  case..*/.int sql
37bf0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
37c00 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72  haseOne(.  Pager
37c10 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
37c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
37c30 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
37c40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
37c50 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
37c60 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
37c70 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
37c80 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  al name */.  int
37c90 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20   noSync         
37ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37cb0 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65  True to omit the
37cc0 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62   xSync on the db
37cd0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
37ce0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37d00 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
37d10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37d20 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37d30 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
37d40 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37d50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37d60 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
37d70 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37d80 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37d90 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
37da0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37db0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
37dc0 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  R.  );.  assert(
37dd0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37de0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
37df0 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20    /* If a prior 
37e00 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
37e10 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f  report that erro
37e20 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66  r again. */.  if
37e30 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
37e40 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
37e50 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
37e60 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  e;..  PAGERTRACE
37e70 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  (("DATABASE SYNC
37e80 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
37e90 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22  r=%s nSize=%d\n"
37ea0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
37eb0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
37ec0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ter, pPager->dbS
37ed0 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ize));..  /* If 
37ee0 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  no database chan
37ef0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
37f00 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  de, return early
37f10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
37f20 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
37f30 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
37f40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
37f50 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  OK;..  if( MEMDB
37f60 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
37f70 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
37f80 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
37f90 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
37fa0 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
37fb0 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  .    ** function
37fc0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
37fd0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
37fe0 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20  mostly a no-op. 
37ff0 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20   However, any.  
38000 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70    ** backup in p
38010 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f  rogress needs to
38020 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
38030 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
38040 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
38050 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
38060 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
38070 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
38080 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50  ager) ){.      P
38090 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
380a0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
380b0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
380c0 61 63 68 65 29 3b 0a 20 20 20 20 20 20 50 67 48  ache);.      PgH
380d0 64 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30  dr *pPageOne = 0
380e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
380f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
38100 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 74 20  /* Must have at 
38110 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 20 66  least one page f
38120 6f 72 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69  or the WAL commi
38130 74 20 66 6c 61 67 2e 0a 20 20 20 20 20 20 20 20  t flag..        
38140 2a 2a 20 54 69 63 6b 65 74 20 5b 32 64 31 61 35  ** Ticket [2d1a5
38150 63 36 37 64 66 63 32 33 36 33 65 34 34 66 32 39  c67dfc2363e44f29
38160 64 39 62 62 64 35 37 66 5d 20 32 30 31 31 2d 30  d9bbd57f] 2011-0
38170 35 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  5-18 */.        
38180 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
38190 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
381a0 26 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20  &pPageOne);.    
381b0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 67      pList = pPag
381c0 65 4f 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 4c  eOne;.        pL
381d0 69 73 74 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ist->pDirty = 0;
381e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
381f0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
38200 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
38210 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
38220 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38230 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
38240 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50  Pager, pList, pP
38250 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 29  ager->dbSize, 1)
38260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38270 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
38280 66 28 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20  f(pPageOne);.   
38290 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
382a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
382b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
382c0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
382d0 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Cache);.      }.
382e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
382f0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
38300 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20  g block updates 
38310 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
38320 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  er. Exactly how 
38330 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  it.      ** does
38340 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e   this depends on
38350 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
38360 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
38370 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  e optimization. 
38380 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62       ** was enab
38390 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
383a0 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
383b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
383c0 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ts the .      **
383d0 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
383e0 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
383f0 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a  ration: .      *
38400 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20  *.      **    * 
38410 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
38420 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
38430 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
38440 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ty for.      ** 
38450 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
38460 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
38470 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nd .      **    
38480 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  * This commit is
38490 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
384a0 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
384b0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
384c0 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79   **    * Exactly
384d0 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
384e0 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
384f0 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
38500 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
38510 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
38520 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
38530 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
38540 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
38550 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
38560 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
38570 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
38580 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
38590 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
385a0 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20  change.      ** 
385b0 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69  counter in 'indi
385c0 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74  rect-mode'. If t
385d0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
385e0 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62  is compiled in b
385f0 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  ut.      ** is n
38600 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f  ot applicable to
38610 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
38620 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a  n, call sqlite3J
38630 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20  ournalCreate(). 
38640 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20       ** to make 
38650 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sure the journal
38660 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c   file has actual
38670 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  ly been created,
38680 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20   then call.     
38690 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
386a0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
386b0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
386c0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69  nge-counter in i
386d0 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  ndirect.      **
386e0 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a   mode. .      **
386f0 0a 20 2