/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 476884ce8d8e845daf88f1b12b8ca446bac5fdc5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 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: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 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 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 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 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, 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 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le */.#ifndef SQ
7c50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
7c60: 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20 2a 70  RENT.  Bitvec *p
7c70: 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20 20 20  AllRead;        
7c80: 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65 61 64     /* Pages read
7c90: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
7ca0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
7cb0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 71  . */.#endif.  sq
7cc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
7cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
7ce0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7cf0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
7d00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
7d10: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
7d20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7d30: 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  r main journal *
7d40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
7d50: 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20   *sjfd;         
7d60: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
7d70: 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  or for sub-journ
7d80: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  al */.  i64 jour
7d90: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
7da0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77      /* Current w
7db0: 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  rite offset in t
7dc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7dd0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
7de0: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
7df0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
7e00: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
7e10: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
7e20: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
7e30: 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50  pBackup;    /* P
7e40: 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f  ointer to list o
7e50: 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70  f ongoing backup
7e60: 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20   processes */.  
7e70: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
7e80: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
7e90: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
7ea0: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
7eb0: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7ed0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
7ee0: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
7ef0: 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61 56   */.  u32 iDataV
7f00: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
7f10: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
7f20: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 63  never database c
7f30: 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20 2a  ontent changes *
7f40: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
7f50: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
7f60: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
7f70: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
7f80: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20  e changes */..  
7f90: 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20  int nMmapOut;   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7fb0: 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61  umber of mmap pa
7fc0: 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75  ges currently ou
7fd0: 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73  tstanding */.  s
7fe0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
7ff0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  map;       /* De
8000: 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d  sired maximum mm
8010: 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48  ap size */.  PgH
8020: 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73  dr *pMmapFreelis
8030: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t;       /* List
8040: 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61   of free mmap pa
8050: 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72  ge headers (pDir
8060: 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ty) */.  /*.  **
8070: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
8080: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
8090: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
80f0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
8100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8110: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
8120: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
8130: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
8140: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
8150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8160: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8170: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
8180: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
8190: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
81a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
81b0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
81c0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
81d0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
81e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
81f0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
8200: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
8210: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
8220: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8230: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8240: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
8250: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
8260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8270: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
8280: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
8290: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
82a0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
82b0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
82c0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
82d0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
82e0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
82f0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
8300: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8310: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8320: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
8330: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
8340: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8350: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8360: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
8370: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
8380: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8390: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
83a0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
83b0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
83c0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
83d0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
83e0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
83f0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
8400: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8410: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
8420: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
8430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8440: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8470: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8480: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8490: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
84a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
84b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
84c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
84d0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
84e0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
84f0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
8500: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
8510: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
8520: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
8530: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8540: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8550: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8560: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8570: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8580: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8590: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
85a0: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
85b0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
85c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
85d0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
85e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
85f0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
8600: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
8610: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
8620: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
8630: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
8640: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8650: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8660: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8670: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8680: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8690: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
86a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
86b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
86c0: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
86d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
86e0: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
86f0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
8700: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
8710: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
8720: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
8730: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
8740: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8750: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8760: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8770: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8780: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8790: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
87a0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
87b0: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
87c0: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
87d0: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
87e0: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
87f0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
8800: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
8810: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
8820: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
8830: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
8840: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8850: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8860: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8870: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8880: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8890: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
88a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
88b0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
88c0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
88d0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
88e0: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
88f0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
8900: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
8910: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
8920: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8930: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
8940: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8950: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8960: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8970: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8980: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8990: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
89a0: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
89b0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
89c0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
89d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
89e0: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
89f0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8a00: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
8a10: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
8a20: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
8a30: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
8a40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8a50: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8a60: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8a70: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8a80: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8a90: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
8aa0: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
8ab0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8ac0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
8ad0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
8ae0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
8af0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
8b00: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
8b10: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8b20: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
8b30: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
8b40: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8b50: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8b60: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8b70: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8b80: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8b90: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
8ba0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
8bb0: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
8bc0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
8bd0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
8be0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
8bf0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8c00: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8c10: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8c20: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8c30: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8c40: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8c50: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c60: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8c70: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8c80: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8c90: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
8ca0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
8cb0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
8cc0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8cd0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
8ce0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8cf0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8d00: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8d10: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8d20: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8d30: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8d40: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8d50: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8d60: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8d70: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8d80: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8d90: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
8da0: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
8db0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
8dc0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
8dd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
8de0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
8df0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8e00: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8e10: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8e20: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8e30: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8e40: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8e50: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8e60: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8e70: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8e80: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8e90: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8ea0: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8eb0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8ec0: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8ed0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8ee0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8ef0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8f00: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8f10: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8f20: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8f30: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8f40: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8f50: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8f60: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8f70: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8f80: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8f90: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8fa0: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8fb0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8fc0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8fd0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8fe0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8ff0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
9000: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
9010: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
9020: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
9030: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
9040: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
9050: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
9060: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
9070: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
9080: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9090: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
90a0: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
90b0: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
90c0: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
90d0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
90e0: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
90f0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
9100: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
9110: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
9120: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
9130: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
9140: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
9150: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
9160: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
9170: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
9180: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
9190: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
91a0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
91b0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
91c0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
91d0: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
91e0: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
91f0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
9200: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
9210: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
9220: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
9230: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
9240: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
9250: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
9260: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
9270: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
9280: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
9290: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
92a0: 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20  cro USEFETCH is 
92b0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
92c0: 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68  llowed to use th
92d0: 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e  e xFetch and xUn
92e0: 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61  fetch.** interfa
92f0: 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ces to access th
9300: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
9310: 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49   memory-mapped I
9320: 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  /O..*/.#if SQLIT
9330: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
9340: 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  0.# define USEFE
9350: 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73  TCH(x) ((x)->bUs
9360: 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20  eFetch).#else.# 
9370: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9380: 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x) 0.#endif../*.
9390: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
93a0: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
93b0: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
93c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
93d0: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
93e0: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
93f0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
9400: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
9410: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
9420: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
9430: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
9440: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
9450: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
9460: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
9470: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
9480: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
9490: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
94a0: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
94b0: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
94c0: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
94d0: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
94e0: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
94f0: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
9500: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
9510: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
9520: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
9530: 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  !=0)../*.** Retu
9540: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
9550: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
9560: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
9570: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
9580: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
9590: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
95a0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64   false..*/.#ifnd
95b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
95c0: 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  AL.static int pa
95d0: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
95e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
95f0: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
9600: 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  !=0);.}.#else.# 
9610: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9620: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9630: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9640: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9650: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9660: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9670: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9680: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9690: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
96a0: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
96b0: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
96c0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
96d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
96e0: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
96f0: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9700: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9710: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9730: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9740: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9750: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9760: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9770: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9780: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9790: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
97a0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
97b0: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
97c0: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
97d0: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
97e0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
97f0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9800: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9830: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9840: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9850: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9860: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9870: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9880: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9890: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
98a0: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
98b0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
98c0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
98d0: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
98e0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
98f0: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9900: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9910: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9920: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9930: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9940: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9950: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9960: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9970: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9980: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9990: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
99a0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
99b0: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
99c0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
99d0: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
99e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
99f0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9a00: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9a10: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9a20: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9a30: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9a40: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9a50: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9a60: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9a70: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9a80: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9a90: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
9aa0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
9ab0: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
9ac0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9ad0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
9ae0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9af0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9b00: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9b10: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9b20: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
9b30: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9b40: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
9b50: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
9b60: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
9b70: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
9b80: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9b90: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
9ba0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9bb0: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
9bc0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
9bd0: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
9be0: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
9bf0: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9c00: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9c10: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9c20: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
9c30: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
9c40: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
9c50: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
9c60: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
9c70: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
9c80: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9c90: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
9ca0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
9cb0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
9cc0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
9cd0: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
9ce0: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
9cf0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9d00: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9d10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9d20: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
9d30: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
9d40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
9d50: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
9d60: 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20   p->noSync );.  
9d70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9d80: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9d90: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
9da0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
9db0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9dc0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9dd0: 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20  EMORY .    );.  
9de0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
9df0: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
9e00: 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50   && p->eState!=P
9e10: 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
9e20: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
9e30: 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20  eWal(p)==0 );.  
9e40: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67  }..  /* If chang
9e50: 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65  eCountDone is se
9e60: 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  t, a RESERVED lo
9e70: 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
9e80: 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20  st be held.  ** 
9e90: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  on the file..  *
9ea0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9eb0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9ec0: 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  one==0 || pPager
9ed0: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
9ee0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
9ef0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45  rt( p->eLock!=PE
9f00: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  NDING_LOCK );.. 
9f10: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61   switch( p->eSta
9f20: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
9f30: 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20  AGER_OPEN:.     
9f40: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
9f50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f60: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9f70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9f90: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
9fa0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
9fb0: 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  he)==0 || pPager
9fc0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
9fd0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9fe0: 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45  case PAGER_READE
9ff0: 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  R:.      assert(
a000: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a010: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a020: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a030: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_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 2d 3e 65 4c 6f 63 6b 3e 3d 53  ert( p->eLock>=S
a060: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
a070: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a080: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a090: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
a0a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a0b0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a0c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a0d0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a0e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a0f0: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
a100: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
a110: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a120: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
a130: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
a140: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
a150: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
a160: 54 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  T.      assert( 
a170: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
a180: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a190: 7a 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 41  ze || pPager->pA
a1a0: 6c 6c 52 65 61 64 20 29 3b 0a 23 65 6e 64 69 66  llRead );.#endif
a1b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a1c0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a1d0: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a1e0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a1f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a200: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a210: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a220: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a230: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a240: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a250: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a260: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a270: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a280: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a290: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a2a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a2b0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a2c0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a2d0: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a2e0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a2f0: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a300: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a310: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a320: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a330: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a340: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a350: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a360: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a370: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a380: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a390: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a3a0: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a3b0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a3c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a3d0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a3e0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a400: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a410: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
a420: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a430: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a440: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a450: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a460: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a470: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a480: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a490: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a4a0: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a4c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a4d0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a4e0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a4f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a500: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a510: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a520: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a530: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a540: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a550: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a560: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a570: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a580: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a590: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a5a0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a5b0: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a5c0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a5d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a5e0: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a5f0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a600: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a610: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a620: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a630: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a640: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a650: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a660: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a670: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a680: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a690: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a6a0: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a6b0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a6c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a6d0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a6e0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a6f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a700: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a710: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a720: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a730: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a740: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a750: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a760: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a770: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a780: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a790: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a7a0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a7b0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a7c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a7d0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a7e0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a7f0: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a800: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a810: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a820: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a830: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a840: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a850: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a860: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a870: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a880: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a890: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a8a0: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a8b0: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a8c0: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a8d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a8e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a8f0: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a900: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a910: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a920: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a930: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
a940: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a950: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a960: 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
a970: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
a980: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
a990: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a9a0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a9b0: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a9c0: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a9d0: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a9e0: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a9f0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
aa00: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
aa10: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
aa20: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
aa30: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
aa40: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
aa50: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
aa60: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
aa70: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
aa80: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
aa90: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
aaa0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aab0: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
aac0: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
aad0: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
aae0: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
aaf0: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
ab00: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
ab10: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
ab20: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
ab30: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
ab40: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
ab50: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
ab60: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
ab70: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
ab80: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
ab90: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
aba0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
abb0: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
abc0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
abd0: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
abe0: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
abf0: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
ac00: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
ac10: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
ac20: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
ac30: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
ac40: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
ac50: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
ac60: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
ac70: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
ac80: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
ac90: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
aca0: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
acb0: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
acc0: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
acd0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ace0: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
acf0: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
ad00: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
ad10: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
ad20: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
ad30: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
ad40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ad50: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
ad60: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
ad70: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
ad80: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ad90: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
ada0: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
adb0: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
adc0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
add0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
ade0: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
adf0: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
ae00: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ae10: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
ae20: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
ae30: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
ae40: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
ae50: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
ae60: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
ae70: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
ae80: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
ae90: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
aea0: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
aeb0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aec0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
aed0: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
aee0: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
aef0: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
af00: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
af10: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
af20: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
af30: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
af40: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
af50: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
af60: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
af70: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
af80: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
af90: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
afa0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
afb0: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
afc0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
afd0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
afe0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
aff0: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
b000: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b010: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b020: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
b030: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
b040: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b050: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b060: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
b070: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
b080: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b090: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b0a0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
b0b0: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
b0c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b0d0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b0e0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
b0f0: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
b100: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b110: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
b120: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
b130: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
b140: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
b150: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
b160: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
b170: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
b180: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
b190: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
b1a0: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
b1b0: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
b1c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
b1d0: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
b1e0: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
b1f0: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
b200: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
b210: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
b220: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
b230: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
b240: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
b250: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
b260: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
b270: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
b280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
b290: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
b2a0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
b2b0: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
b2c0: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
b2d0: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
b2e0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
b2f0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b300: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
b310: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
b320: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
b330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b340: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
b350: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
b360: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
b370: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
b380: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
b390: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
b3a0: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
b3b0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
b3c0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b3d0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
b3e0: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
b3f0: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
b400: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
b410: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
b420: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
b430: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
b440: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
b450: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
b460: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
b470: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
b480: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
b490: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
b4a0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
b4b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
b4c0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
b4d0: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
b4e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b4f0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
b500: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
b510: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
b520: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
b530: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
b540: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
b550: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
b560: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
b570: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
b580: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
b590: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
b5a0: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
b5b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
b5c0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
b5d0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
b5e0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b5f0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b600: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
b610: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
b620: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
b630: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b640: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
b650: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b660: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
b670: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
b680: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
b690: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
b6a0: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
b6b0: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
b6c0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b6d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
b6e0: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
b6f0: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
b700: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b710: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b720: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b730: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
b740: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
b750: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
b760: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
b770: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
b780: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
b790: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b7a0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b7b0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
b7c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b7d0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b7e0: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
b7f0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
b800: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b810: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
b820: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
b830: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b840: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b850: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
b860: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
b870: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
b880: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
b890: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
b8a0: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
b8b0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
b8c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
b8d0: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
b8e0: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
b8f0: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
b900: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
b910: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
b920: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
b930: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
b940: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
b950: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
b960: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
b970: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
b980: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
b990: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
b9a0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
b9b0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
b9c0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
b9d0: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
b9e0: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
b9f0: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
ba00: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
ba10: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
ba20: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
ba30: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
ba40: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
ba50: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
ba60: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
ba70: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
ba80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ba90: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
baa0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
bab0: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
bac0: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
bad0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
bae0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
baf0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
bb00: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
bb10: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
bb20: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
bb30: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
bb40: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
bb50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bb60: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
bb70: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
bb80: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
bb90: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
bba0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
bbb0: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
bbc0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
bbd0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
bbe0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
bbf0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
bc00: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
bc10: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
bc20: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bc30: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bc40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bc50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
bc60: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
bc70: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
bc80: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
bc90: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
bca0: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
bcb0: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
bcc0: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
bcd0: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
bce0: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
bcf0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
bd00: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
bd10: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
bd20: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
bd30: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
bd40: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
bd50: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
bd60: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
bd70: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
bd80: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
bd90: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
bda0: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
bdb0: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
bdc0: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
bdd0: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
bde0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
bdf0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
be00: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
be10: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
be20: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
be30: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
be40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
be50: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
be60: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
be70: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
be80: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
be90: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
bea0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
beb0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
bec0: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
bed0: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
bee0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
bef0: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
bf00: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
bf10: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
bf20: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
bf30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bf40: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
bf50: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
bf60: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
bf70: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
bf80: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
bf90: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
bfa0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
bfb0: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
bfc0: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
bfd0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bfe0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
bff0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
c000: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
c010: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
c020: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
c030: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  on.** can be use
c040: 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  d with this page
c050: 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  r. The optimizat
c060: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
c070: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74  if:.**.**  (a) t
c080: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c090: 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61  d by OsDeviceCha
c0a0: 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69  racteristics() i
c0b0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
c0c0: 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65        a database
c0d0: 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69   page may be wri
c0e0: 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c  tten atomically,
c0f0: 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65   and.**  (b) the
c100: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c110: 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  by OsSectorSize(
c120: 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) is less than o
c130: 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20  r equal.**      
c140: 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
c150: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69  ..**.** The opti
c160: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f  mization is also
c170: 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20   always enabled 
c180: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
c190: 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e  les. It is.** an
c1a0: 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74   error to call t
c1b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
c1c0: 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64  pPager is opened
c1d0: 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   on an in-memory
c1e0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  .** database..**
c1f0: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
c200: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
c210: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
c220: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
c230: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
c240: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
c250: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
c260: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c270: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
c280: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
c290: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
c2a0: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
c2b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c2c0: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
c2d0: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
c2e0: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
c2f0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
c300: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
c310: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
c320: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
c330: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c350: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
c360: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
c370: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
c3a0: 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ze */.    int sz
c3b0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c3d0: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20  age size */..   
c3e0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
c3f0: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
c400: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
c410: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c420: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
c430: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
c440: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
c450: 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65  Size;.    szPage
c460: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
c470: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
c480: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c490: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
c4a0: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
c4b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c4c0: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
c4d0: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
c4e0: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
c4f0: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
c500: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
c510: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
c520: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
c530: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
c540: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
c550: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
c560: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d  PG_SZ(pPager);.}
c570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c580: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c590: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
c5a0: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
c5b0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
c5c0: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
c5d0: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
c5e0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
c5f0: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
c600: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
c610: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
c620: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c630: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
c640: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
c650: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
c660: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
c670: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c680: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
c690: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
c6a0: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
c6b0: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
c6c0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
c6d0: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
c6e0: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
c6f0: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
c700: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
c710: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
c720: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c730: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
c740: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
c750: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
c760: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
c770: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
c780: 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a  )pPage->pData);.
c790: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  }.static void pa
c7a0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
c7b0: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c7c0: 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73    pPage->pageHas
c7d0: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
c7e0: 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  sh(pPage);.}../*
c7f0: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41  .** The CHECK_PA
c800: 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  GE macro takes a
c810: 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72   PgHdr* as an ar
c820: 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54  gument. If SQLIT
c830: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a  E_CHECK_PAGES.**
c840: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64   is defined, and
c850: 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
c860: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
c870: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68  t() statement ch
c880: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  ecks.** that the
c890: 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20   page is either 
c8a0: 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d  dirty or still m
c8b0: 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75  atches the calcu
c8c0: 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e  lated page-hash.
c8d0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
c8e0: 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50  K_PAGE(x) checkP
c8f0: 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f  age(x).static vo
c900: 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48  id checkPage(PgH
c910: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
c920: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
c930: 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  >pPager;.  asser
c940: 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
c950: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
c960: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67  ;.  assert( (pPg
c970: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
c980: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
c990: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
c9a0: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
c9b0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
c9c0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
c9d0: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
c9e0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
c9f0: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
ca00: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29  _set_pagehash(X)
ca10: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
ca20: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
ca30: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
ca40: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
ca50: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
ca60: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
ca70: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
ca80: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
ca90: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
caa0: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
cab0: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
cac0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cad0: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
cae0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
caf0: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
cb00: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
cb10: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
cb20: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
cb30: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
cb40: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
cb50: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
cb60: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
cb70: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
cb80: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cb90: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
cba0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
cbb0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
cbc0: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
cbd0: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
cbe0: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
cbf0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
cc00: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
cc10: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
cc20: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
cc30: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
cc40: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
cc50: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
cc60: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
cc70: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
cc80: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cc90: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
cca0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
ccb0: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
ccc0: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
ccd0: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
cce0: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
ccf0: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
cd00: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
cd10: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
cd20: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
cd30: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
cd40: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
cd50: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
cd60: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
cd70: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
cd80: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
cd90: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
cda0: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
cdb0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
cdc0: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
cdd0: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
cde0: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
cdf0: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
ce00: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
ce10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
ce20: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
ce30: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
ce40: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
ce50: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
ce60: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
ce70: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
ce80: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
ce90: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
cea0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
ceb0: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
cec0: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
ced0: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
cee0: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
cef0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
cf00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
cf10: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
cf20: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
cf30: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
cf40: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
cf50: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf70: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
cf80: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cfa0: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
cfb0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
cfc0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
cfd0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
cfe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
cff0: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
d000: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
d010: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
d020: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
d030: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
d040: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
d050: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
d060: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
d070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
d080: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
d090: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
d0a0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
d0b0: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
d0c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
d0d0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
d0e0: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
d0f0: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
d100: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d110: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
d120: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
d130: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
d140: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
d150: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
d160: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
d170: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
d180: 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20  r .   || len==0 
d190: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d1a0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
d1b0: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
d1c0: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
d1d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
d1e0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d1f0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
d200: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
d210: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
d220: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
d230: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d240: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
d250: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
d260: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
d270: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
d280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d290: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
d2a0: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
d2b0: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
d2c0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
d2d0: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
d2e0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
d2f0: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
d300: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
d310: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
d320: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
d330: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
d340: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
d350: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
d360: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
d370: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d380: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
d390: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
d3a0: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
d3b0: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
d3c0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
d3d0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
d3e0: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
d3f0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
d400: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
d410: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
d420: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
d430: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
d440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d450: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
d460: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
d470: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
d480: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
d490: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
d4a0: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
d4b0: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
d4c0: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
d4d0: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
d4e0: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
d4f0: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
d500: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
d510: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
d520: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
d530: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
d540: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
d550: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
d560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
d580: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
d5a0: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d5c0: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
d610: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
d620: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
d630: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d640: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
d650: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
d660: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
d670: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
d680: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
d690: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d6a0: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
d6b0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d6c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d6d0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
d6e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
d6f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
d700: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
d710: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
d720: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d730: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
d740: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
d750: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
d760: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
d770: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
d780: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
d790: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d7a0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
d7b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d7c0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
d7d0: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
d7e0: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
d7f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
d800: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
d810: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
d820: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
d830: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
d840: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
d850: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
d860: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
d870: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
d880: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d890: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
d8a0: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
d8b0: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
d8c0: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
d8d0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
d8e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
d8f0: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
d900: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
d910: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
d920: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
d930: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d940: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
d950: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
d960: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
d970: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
d980: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d990: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
d9a0: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
d9b0: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
d9c0: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
d9d0: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
d9e0: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
d9f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
da00: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
da10: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
da20: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
da30: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
da40: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
da50: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
da60: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
da70: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
da80: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
da90: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
daa0: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
dab0: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
dac0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
dad0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
dae0: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
daf0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
db00: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
db10: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
db20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
db30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
db40: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
db50: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
db60: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
db70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
db80: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
dbb0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
dbc0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
dbd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
dbe0: 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
dbf0: 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
dc00: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
dc10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
dc20: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
dc30: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
dc40: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
dc50: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
dc60: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
dc70: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
dc80: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
dc90: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
dca0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
dcb0: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
dcc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dcd0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
dce0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
dcf0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
dd00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
dd10: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
dd20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dd30: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
dd40: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
dd50: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
dd60: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
dd70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dd80: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
dd90: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
dda0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
ddb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
ddc0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
ddd0: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  Y|pPager->syncFl
dde0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
ddf0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
de00: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
de10: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
de20: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
de30: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
de40: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
de50: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
de60: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
de70: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
de80: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
de90: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
dea0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
deb0: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
dec0: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
ded0: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
dee0: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
def0: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
df00: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
df10: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
df20: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
df30: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
df40: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
df50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
df60: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
df70: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
df80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df90: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
dfa0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
dfb0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
dfc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
dfd0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
dfe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
dff0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e000: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
e010: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e020: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e030: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
e040: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
e050: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
e060: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
e070: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
e080: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
e090: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
e0a0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
e0b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
e0c0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
e0d0: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
e0e0: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
e0f0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e100: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
e110: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
e120: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
e130: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
e140: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
e150: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
e160: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
e170: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
e180: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
e190: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
e1a0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
e1b0: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
e1c0: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
e1d0: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
e1e0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
e1f0: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
e200: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
e210: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
e220: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
e230: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
e240: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
e250: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
e260: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
e270: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
e280: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
e290: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
e2a0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
e2b0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
e2c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2e0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e2f0: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
e300: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
e310: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
e320: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
e330: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
e340: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
e350: 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
e360: 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66  eSize;/* Size of
e370: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
e380: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
e390: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e3c0: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
e3d0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
e3e0: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e410: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
e420: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e430: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
e440: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
e450: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
e460: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
e470: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e480: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
e490: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
e4a0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
e4b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
e4c0: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
e4d0: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
e4e0: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
e4f0: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
e500: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
e510: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
e520: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
e530: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
e540: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
e550: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
e560: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
e570: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
e580: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
e590: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e5a0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
e5b0: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
e5c0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
e5d0: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
e5e0: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
e5f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
e600: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
e610: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
e620: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e630: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
e640: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
e650: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
e660: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
e670: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
e680: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
e690: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
e6a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
e6b0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
e6c0: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
e6d0: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
e6e0: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
e6f0: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
e700: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
e710: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
e720: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
e730: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
e740: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
e750: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
e760: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
e770: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
e780: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
e790: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
e7a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
e7b0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
e7c0: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
e7d0: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
e7e0: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
e7f0: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
e800: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
e810: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
e820: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
e830: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
e840: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e850: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
e860: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
e870: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
e880: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
e890: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
e8a0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
e8b0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
e8c0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e8d0: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
e8e0: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
e8f0: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
e900: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
e910: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
e920: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
e930: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
e940: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
e950: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
e960: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
e970: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
e980: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
e990: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
e9a0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
e9b0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
e9c0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
e9d0: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
e9e0: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
e9f0: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
ea00: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
ea10: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
ea20: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
ea30: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
ea40: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
ea50: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
ea60: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
ea70: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
ea80: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
ea90: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
eaa0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
eab0: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
eac0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
ead0: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
eae0: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
eaf0: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
eb00: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
eb10: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
eb20: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
eb30: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
eb40: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
eb50: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
eb60: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
eb70: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
eb80: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
eb90: 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a  (zHeader, 0, siz
eba0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ebb0: 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c)+4);.  }..  /*
ebc0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
ebd0: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a  k-hash initializ
ebe0: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
ebf0: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
ec00: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
ec10: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
ec20: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
ec30: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
ec40: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ec50: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
ec60: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ec70: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
ec80: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
ec90: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
eca0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ecb0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
ecc0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
ecd0: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
ece0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
ecf0: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
ed00: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
ed10: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ed20: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ed30: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
ed40: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  ctorSize);..  /*
ed50: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
ed60: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
ed70: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ed80: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
ed90: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
eda0: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ze);..  /* Initi
edb0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c  alizing the tail
edc0: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
edd0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
ede0: 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a    Everything.  *
edf0: 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20  * works find if 
ee00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65  the following me
ee10: 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65  mset() is omitte
ee20: 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69  d.  But initiali
ee30: 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65  zing.  ** the me
ee40: 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61  mory prevents va
ee50: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70  lgrind from comp
ee60: 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61  laining, so we a
ee70: 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20  re willing to.  
ee80: 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66  ** take the perf
ee90: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a  ormance hit..  *
eea0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61  /.  memset(&zHea
eeb0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eec0: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30  nalMagic)+20], 0
eed0: 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64  ,.         nHead
eee0: 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72  er-(sizeof(aJour
eef0: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a  nalMagic)+20));.
ef00: 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c  .  /* In theory,
ef10: 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65   it is only nece
ef20: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
ef30: 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74  he 28 bytes that
ef40: 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e   the .  ** journ
ef50: 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d  al header consum
ef60: 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
ef70: 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65  l file here. The
ef80: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  n increment the 
ef90: 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72  .  ** Pager.jour
efa0: 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20  nalOff variable 
efb0: 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  by JOURNAL_HDR_S
efc0: 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  Z so that the ne
efd0: 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  xt .  ** record 
efe0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
eff0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74  e following sect
f000: 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61  or (leaving a ga
f010: 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  p in the file.  
f020: 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ** that will be 
f030: 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65  implicitly fille
f040: 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e  d in by the OS).
f050: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76  .  **.  ** Howev
f060: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  er it has been d
f070: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f  iscovered that o
f080: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74  n some systems t
f090: 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20  his pattern can 
f0a0: 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69  .  ** be signifi
f0b0: 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68  cantly slower th
f0c0: 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  an contiguously 
f0d0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f0e0: 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65  the file,.  ** e
f0f0: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
f100: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69  s explicitly wri
f110: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f120: 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20   block of .  ** 
f130: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
f140: 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74  - 28) bytes that
f150: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
f160: 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68  d. So that is wh
f170: 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e  at.  ** is done.
f180: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
f190: 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64  loop is required
f1a0: 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68   here in case th
f1b0: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
f1c0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
f1d0: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
f1e0: 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65  page size. Since
f1f0: 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66   the zHeader buf
f200: 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65  fer is only Page
f210: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20  r.pageSize.  ** 
f220: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d  bytes in size, m
f230: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c  ore than one cal
f240: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72  l to sqlite3OsWr
f250: 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71  ite() may be req
f260: 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f  uired.  ** to po
f270: 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72  pulate the entir
f280: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f290: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20   sector..  */ . 
f2a0: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
f2b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
f2c0: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
f2d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
f2e0: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
f2f0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
f300: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
f310: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
f320: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
f330: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
f340: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
f350: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
f360: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
f370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f380: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f390: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f3a0: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
f3b0: 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
f3c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f3d0: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
f3e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
f3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
f400: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
f410: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
f420: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
f430: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
f440: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
f450: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
f460: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
f470: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f480: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
f490: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
f4a0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f4b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
f4c0: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
f4d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f4e0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
f4f0: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
f500: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
f510: 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70  for.** a descrip
f520: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
f530: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
f540: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
f550: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
f560: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e  uccessfully, *pN
f570: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
f580: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
f590: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
f5a0: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
f5b0: 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69  r and *pDbSize i
f5c0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
f5d0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
f5e0: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
f5f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
f600: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
f610: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
f620: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
f630: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
f640: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f650: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
f660: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
f670: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
f680: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
f690: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
f6a0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
f6b0: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
f6c0: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
f6d0: 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63  urned and *pNRec
f6e0: 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72   and *PDbSize ar
f6f0: 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66  e undefined.  If
f700: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
f710: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
f720: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
f730: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
f740: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
f750: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
f760: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
f770: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
f780: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
f790: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
f7a0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
f7b0: 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72  sHot,.  i64 jour
f7c0: 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20  nalSize,        
f7d0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f7e0: 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
f7f0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
f800: 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  /.  u32 *pNRec, 
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72   /* OUT: Value r
f830: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65  ead from the nRe
f840: 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32  c field */.  u32
f850: 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20   *pDbSize       
f860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f870: 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69  : Value of origi
f880: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  nal database siz
f890: 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  e field */.){.  
f8a0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8c0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
f8d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
f8e0: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a  Magic[8];     /*
f8f0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
f900: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
f910: 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
f920: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
f930: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
f940: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f950: 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a   being read */..
f960: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
f970: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
f980: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
f990: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
f9a0: 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76  en. */..  /* Adv
f9b0: 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ance Pager.journ
f9c0: 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61  alOff to the sta
f9d0: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73  rt of the next s
f9e0: 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20  ector. If the.  
f9f0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
fa00: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
fa10: 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68   there to be a h
fa20: 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20  eader stored at 
fa30: 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c  this.  ** point,
fa40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
fa50: 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ONE..  */.  pPag
fa60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
fa70: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
fa80: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
fa90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
faa0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
fab0: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
fac0: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
fad0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
fae0: 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  NE;.  }.  iHdrOf
faf0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
fb00: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65  nalOff;..  /* Re
fb10: 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ad in the first 
fb20: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
fb30: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49  ournal header. I
fb40: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
fb50: 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61  tch.  ** the  ma
fb60: 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64  gic string found
fb70: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
fb80: 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65   each journal he
fb90: 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a  ader, return.  *
fba0: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49  * SQLITE_DONE. I
fbb0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
fbc0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
fbd0: 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
fbe0: 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63  rwise,.  ** proc
fbf0: 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
fc00: 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66  isHot || iHdrOff
fc10: 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
fc20: 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  lHdr ){.    rc =
fc30: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
fc40: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
fc50: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
fc60: 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20  c), iHdrOff);.  
fc70: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
fc80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fc90: 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d   }.    if( memcm
fca0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
fcb0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
fcc0: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
fcd0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fce0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
fcf0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
fd00: 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32  e first three 32
fd10: 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74  -bit fields of t
fd20: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
fd30: 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a  r: The nRec.  **
fd40: 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63   field, the chec
fd50: 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72  ksum-initializer
fd60: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
fd70: 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74  e size at the st
fd80: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
fd90: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74  transaction. Ret
fda0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fdb0: 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
fdc0: 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  es wrong..  */. 
fdd0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
fde0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
fdf0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
fe00: 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29  drOff+8, pNRec))
fe10: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
fe20: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fe30: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fe40: 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61  iHdrOff+12, &pPa
fe50: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29  ger->cksumInit))
fe60: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
fe70: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fe80: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fe90: 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53  iHdrOff+16, pDbS
fea0: 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ize)).  ){.    r
feb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
fec0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
fed0: 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
fee0: 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b    u32 iPageSize;
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff00: 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  * Page-size fiel
ff10: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
ff20: 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  der */.    u32 i
ff30: 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  SectorSize;     
ff40: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
ff50: 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  r-size field of 
ff60: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
ff70: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
ff80: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
ff90: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
ffa0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
ffb0: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
ffc0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
ffd0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
ffe0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
fff0: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
10000 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
10010 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
10020 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10030 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
10040 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
10050 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10060 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
10070 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53  /* Versions of S
10080 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
10090 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67  .5.8 set the pag
100a0 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
100b0 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
100c0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72  al header to zer
100d0 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  o. In this case,
100e0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
100f0 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
10100 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
10110 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
10120 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  o the correct pa
10130 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  ge size..    */.
10140 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10150 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  e==0 ){.      iP
10160 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
10170 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
10180 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
10190 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
101a0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
101b0 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
101c0 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
101d0 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
101e0 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
101f0 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
10200 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
10210 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
10220 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
10230 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
10240 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
10250 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
10260 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
10270 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
10280 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
10290 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
102a0 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
102b0 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
102c0 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
102d0 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
102e0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
102f0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
10300 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
10310 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
10320 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
10330 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
10340 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
10350 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
10360 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
10370 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
10380 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
10390 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
103a0 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
103b0 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
103c0 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
103d0 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
103e0 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
103f0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
10400 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
10410 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
10420 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
10430 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
10440 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
10450 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
10460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
10470 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
10480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10490 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
104a0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
104b0 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
104c0 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
104d0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
104e0 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
104f0 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
10500 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
10510 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
10520 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
10530 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
10540 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
10550 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
10560 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10570 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
10580 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b  &iPageSize, -1);
10590 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
105a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
105b0 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
105c0 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
105d0 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
105e0 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
105f0 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
10600 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
10610 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
10620 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
10630 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
10640 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
10650 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
10660 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
10670 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
10680 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
10690 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
106a0 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
106b0 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
106c0 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
106d0 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
106e0 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
106f0 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
10700 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
10710 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
10720 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
10730 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
10740 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
10750 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
10760 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10770 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
10780 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
10790 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
107a0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
107b0 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
107c0 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
107d0 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
107e0 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
107f0 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
10800 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
10810 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
10820 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
10830 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
10840 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
10850 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
10860 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
10870 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
10880 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
10890 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
108a0 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
108b0 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
108c0 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
108d0 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
108e0 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
108f0 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
10900 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
10910 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
10920 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
10930 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
10940 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
10950 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
10960 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
10970 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
10980 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
10990 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
109a0 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
109b0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
109c0 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
109d0 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
109e0 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
109f0 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
10a00 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
10a10 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
10a20 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
10a30 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
10a40 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
10a50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
10a60 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
10a70 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
10a80 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
10a90 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
10aa0 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
10ab0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10ac0 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
10ad0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
10ae0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10af0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10b00 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10b30 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
10b40 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
10b50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
10b60 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
10b70 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
10b80 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
10b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10ba0 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
10bb0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
10bc0 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
10bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10be0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
10c00 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
10c10 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
10c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
10c30 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
10c40 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61   zMaster */..  a
10c50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
10c60 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20  etMaster==0 );. 
10c70 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
10c80 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
10c90 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
10ca0 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
10cb0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
10cc0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
10cd0 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73  EMORY .   || !is
10ce0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
10cf0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10d10 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
10d20 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
10d30 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
10d40 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
10d50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
10d60 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
10d70 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  the length in by
10d80 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  tes and the chec
10d90 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20  ksum of zMaster 
10da0 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72  */.  for(nMaster
10db0 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73  =0; zMaster[nMas
10dc0 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29  ter]; nMaster++)
10dd0 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
10de0 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
10df0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
10e00 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
10e10 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
10e20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
10e30 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
10e40 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
10e50 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
10e60 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
10e70 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
10e80 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
10e90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
10ea0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
10eb0 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
10ec0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
10ed0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
10ee0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
10ef0 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
10f00 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64  ager);.  }.  iHd
10f10 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
10f20 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
10f30 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
10f40 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74  r journal data t
10f50 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
10f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
10f70 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
10f80 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
10f90 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
10fa0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
10fb0 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72  /.  if( (0 != (r
10fc0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10fd0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10fe0 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  rOff, PAGER_MJ_P
10ff0 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20  GNO(pPager)))). 
11000 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
11010 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
11020 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
11030 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69  ster, nMaster, i
11040 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c  HdrOff+4))).   |
11050 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
11060 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
11070 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
11080 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65  +nMaster, nMaste
11090 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  r))).   || (0 !=
110a0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
110b0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
110c0 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
110d0 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20  r+4, cksum))).  
110e0 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
110f0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11100 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
11110 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20  rnalMagic, 8,.  
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
11140 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
11150 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
11160 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
11170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11180 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
11190 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
111a0 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
111b0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
111c0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
111d0 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
111e0 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
111f0 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
11200 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
11210 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
11220 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
11230 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
11240 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
11250 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
11260 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
11270 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
11280 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
11290 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
112a0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
112b0 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
112c0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
112d0 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
112e0 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
112f0 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
11300 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
11310 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
11320 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
11330 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
11340 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
11350 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
11360 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
11370 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
11380 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
11390 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
113a0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
113b0 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
113c0 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
113d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
113e0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
113f0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
11400 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11410 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
11420 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11430 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  c;.}../*.** Disc
11440 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63  ard the entire c
11450 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
11460 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61  n-memory page-ca
11470 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
11480 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
11490 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
114a0 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56    pPager->iDataV
114b0 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69  ersion++;.  sqli
114c0 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
114d0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
114e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
114f0 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
11500 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
11510 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50  ** Return the pP
11520 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
11530 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20  on value.*/.u32 
11540 73 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61  sqlite3PagerData
11550 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70  Version(Pager *p
11560 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
11570 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
11580 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  >PAGER_OPEN );. 
11590 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
115a0 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a  iDataVersion;.}.
115b0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
115c0 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
115d0 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
115e0 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
115f0 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11600 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
11610 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
11620 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
11630 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11640 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
11650 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
11660 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11670 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
11680 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
11690 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
116a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
116b0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
116c0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
116d0 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
116e0 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
116f0 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11700 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11710 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11730 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11740 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
11750 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
11760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
11770 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
11780 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75  de || sqlite3Jou
11790 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
117a0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
117b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
117c0 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
117d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
117e0 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
117f0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11800 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11810 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11820 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11830 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11840 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
11850 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
11860 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
11870 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
11880 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
11890 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
118a0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
118b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
118c0 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
118d0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
118e0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
118f0 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11900 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11910 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11920 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11930 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11940 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11950 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11960 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11970 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11980 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
11990 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
119a0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
119b0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
119c0 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
119d0 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
119e0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
119f0 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11a00 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11a10 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11a20 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11a30 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11a40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11a50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11a60 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
11a70 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
11a80 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
11a90 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
11aa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11ab0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11ac0 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
11ad0 54 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20  T./*.** If they 
11ae0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 2c  are not already,
11af0 20 62 65 67 69 6e 20 72 65 63 6f 72 64 69 6e 67   begin recording
11b00 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20   all pages read 
11b10 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
11b20 61 79 65 72 0a 2a 2a 20 62 79 20 74 68 65 20 62  ayer.** by the b
11b30 2d 74 72 65 65 20 6c 61 79 65 72 20 54 68 69 73  -tree layer This
11b40 20 69 73 20 75 73 65 64 20 62 79 20 63 6f 6e 63   is used by conc
11b50 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
11b60 6f 6e 73 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53  ons. Return.** S
11b70 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11b80 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
11b90 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
11ba0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69  (SQLITE_NOMEM) i
11bb0 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
11bc0 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
11bd0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 43 6f  ite3PagerBeginCo
11be0 6e 63 75 72 72 65 6e 74 28 50 61 67 65 72 20 2a  ncurrent(Pager *
11bf0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
11c00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11c10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
11c20 6c 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lRead==0 ){.    
11c30 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
11c40 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
11c50 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
11c60 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
11c70 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
11c80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
11c90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11ca0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65  rn rc;.}../* !de
11cc0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11cd0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a  T_CONCURRENT).**
11ce0 0a 2a 2a 20 53 74 6f 70 20 72 65 63 6f 72 64 69  .** Stop recordi
11cf0 6e 67 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  ng all pages rea
11d00 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
11d10 20 6c 61 79 65 72 20 62 79 20 74 68 65 20 62 2d   layer by the b-
11d20 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 61 6e  tree layer.** an
11d30 64 20 64 69 73 63 61 72 64 20 61 6e 79 20 63 75  d discard any cu
11d40 72 72 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a 2a  rrent records..*
11d50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
11d60 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74  gerEndConcurrent
11d70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11d80 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
11d90 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
11da0 70 41 6c 6c 52 65 61 64 29 3b 0a 20 20 70 50 61  pAllRead);.  pPa
11db0 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d 20  ger->pAllRead = 
11dc0 30 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65  0;.}../* !define
11dd0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
11de0 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20  NCURRENT).**.** 
11df0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
11e00 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
11e10 6e 20 77 61 6c 20 6d 6f 64 65 2e 20 46 61 6c 73  n wal mode. Fals
11e20 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
11e30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11e40 49 73 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  IsWal(Pager *pPa
11e50 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
11e60 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 3b 0a  Pager->pWal!=0;.
11e70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11e80 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
11e90 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  NT */../*.** Fre
11ea0 65 20 74 68 65 20 50 61 67 65 72 2e 70 49 6e 4a  e the Pager.pInJ
11eb0 6f 75 72 6e 61 6c 20 61 6e 64 20 50 61 67 65 72  ournal and Pager
11ec0 2e 70 41 6c 6c 52 65 61 64 20 62 69 74 76 65 63  .pAllRead bitvec
11ed0 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
11ee0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
11ef0 65 65 42 69 74 76 65 63 73 28 50 61 67 65 72 20  eeBitvecs(Pager 
11f00 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
11f10 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11f20 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
11f30 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
11f40 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
11f50 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e    sqlite3PagerEn
11f60 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 50 61 67  dConcurrent(pPag
11f70 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  er);.}../*.** Th
11f80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11f90 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11fa0 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11fb0 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
11fc0 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
11fd0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
11fe0 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
11ff0 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
12000 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
12010 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
12020 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
12030 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
12040 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
12050 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
12060 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
12070 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
12080 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
12090 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
120a0 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
120b0 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
120c0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
120d0 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
120e0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
120f0 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
12100 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
12110 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
12120 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
12130 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12140 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
12150 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12160 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
12170 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
12180 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
12190 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
121a0 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
121b0 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
121c0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
121d0 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
121e0 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
121f0 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
12200 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
12210 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
12220 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
12230 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
12240 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
12250 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
12260 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
12270 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
12280 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
12290 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
122a0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
122b0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
122c0 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
122d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
122e0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
122f0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
12300 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
12310 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
12320 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12330 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
12340 20 20 70 61 67 65 72 46 72 65 65 42 69 74 76 65    pagerFreeBitve
12350 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  cs(pPager);.  re
12360 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
12370 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
12380 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
12390 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
123a0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
123b0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
123c0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
123d0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
123e0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
123f0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12400 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12410 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
12420 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
12430 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
12460 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
12470 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
12480 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
12490 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
124a0 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
124b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
124c0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
124d0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
124e0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
124f0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
12500 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
12510 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
12520 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
12530 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
12540 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12550 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
12560 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
12570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
12580 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
12590 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
125a0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
125b0 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
125c0 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
125d0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
125e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
125f0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
12600 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12610 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
12620 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
12630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12640 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12650 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
12660 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12670 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12680 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
12690 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
126a0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
126b0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
126c0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
126d0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
126e0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
126f0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
12700 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
12710 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
12720 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12730 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
12740 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12750 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
12760 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12770 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
12780 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12790 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
127a0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
127b0 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
127c0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
127d0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
127e0 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
127f0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
12800 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
12810 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
12820 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
12830 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
12840 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
12850 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
12860 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
12870 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
12880 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
12890 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
128a0 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
128b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
128c0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
128d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
128e0 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
128f0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
12900 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
12910 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
12920 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
12930 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
12940 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
12950 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
12960 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
12970 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
12980 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
12990 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
129a0 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
129b0 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
129c0 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
129d0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
129e0 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
129f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
12a00 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12a10 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12a20 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12a30 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12a40 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12a50 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12a60 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12a70 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12a80 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12a90 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12aa0 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12ab0 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12ac0 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12ad0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12ae0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
12af0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
12b00 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12b10 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12b20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
12b30 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
12b40 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12b50 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12b60 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12b70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12b80 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12b90 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12ba0 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
12bb0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12bc0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12bd0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12be0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
12bf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12c00 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
12c10 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12c30 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
12c40 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33  Pager) ) sqlite3
12c50 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
12c60 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ->fd, 0, 0);.  }
12c70 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12c80 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
12c90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12ca0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12cb0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
12cc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12cd0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
12ce0 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
12cf0 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
12d00 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
12d10 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
12d20 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
12d30 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
12d40 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
12d50 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
12d60 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
12d70 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
12d80 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
12d90 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
12da0 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
12db0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
12dc0 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
12dd0 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
12de0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
12df0 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
12e00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12e10 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
12e20 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
12e30 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12e40 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
12e50 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
12e60 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
12e70 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
12e80 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
12e90 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12ea0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
12eb0 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
12ec0 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
12ed0 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
12ee0 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
12ef0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
12f00 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
12f10 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
12f20 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
12f30 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
12f40 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  errCode..**.** T
12f50 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
12f60 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
12f70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12f80 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
12f90 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
12fa0 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
12fb0 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
12fc0 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
12fd0 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
12fe0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12ff0 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
13000 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
13010 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
13020 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
13030 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
13040 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
13050 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
13060 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
13070 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
13080 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
13090 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
130a0 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
130b0 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
130c0 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
130d0 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
130e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
130f0 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
13100 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
13110 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
13120 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
13130 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
13140 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
13150 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
13160 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
13170 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
13180 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
13190 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
131a0 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
131b0 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
131c0 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
131d0 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
131e0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
131f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
13200 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
13210 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
13220 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
13230 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
13240 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
13250 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
13260 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a  r, Pgno nPage);.
13270 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13280 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
13290 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61  action. A transa
132a0 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79  ction is usually
132b0 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69   ended by .** ei
132c0 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72  ther a COMMIT or
132d0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72   a ROLLBACK oper
132e0 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74  ation. This rout
132f0 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ine may be calle
13300 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c  d .** after roll
13310 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  back of a hot-jo
13320 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20  urnal, or if an 
13330 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
13340 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68  le opening.** th
13350 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
13360 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65  r writing the ve
13370 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  ry first journal
13380 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20  -header of a.** 
13390 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
133a0 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tion..** .** Thi
133b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
133c0 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47  er called in PAG
133d0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
133e0 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a  If it is called.
133f0 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45  ** in PAGER_NONE
13400 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45 44   or PAGER_SHARED
13410 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c   state and the l
13420 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73  ock held is less
13430 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68  .** exclusive th
13440 61 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  an a RESERVED lo
13450 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ck, it is a no-o
13460 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  p..**.** Otherwi
13470 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
13480 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
13490 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
134a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
134b0 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
134c0 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
134d0 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
134e0 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
134f0 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
13500 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
13510 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
13520 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
13530 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
13540 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
13550 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
13560 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
13570 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
13580 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13590 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
135a0 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
135b0 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
135c0 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
135d0 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
135e0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
135f0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
13600 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
13610 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
13620 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
13630 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
13640 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
13650 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
13660 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
13670 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
13680 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
13690 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
136a0 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
136b0 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
136c0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
136d0 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
136e0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
136f0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
13700 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
13710 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
13720 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
13730 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
13740 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
13750 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
13760 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
13770 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
13780 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
13790 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
137a0 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
137b0 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
137c0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
137d0 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
137e0 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
137f0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
13800 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13810 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
13820 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
13830 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
13840 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
13850 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
13860 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
13870 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
13880 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
13890 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
138a0 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
138b0 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
138c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
138d0 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
138e0 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
138f0 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
13900 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
13910 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
13920 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
13930 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
13940 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
13950 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
13960 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
13970 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
13980 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
13990 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67  nalized, the pag
139a0 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45  er moves to PAGE
139b0 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a  R_READER state..
139c0 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  ** If running in
139d0 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72   non-exclusive r
139e0 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68  ollback mode, th
139f0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  e lock on the fi
13a00 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72  le is .** downgr
13a10 61 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44  aded to a SHARED
13a20 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
13a30 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
13a40 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
13a50 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
13a60 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
13a70 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49  .** any of the I
13a80 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  O operations to 
13a90 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
13aa0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c  rnal file or unl
13ab0 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ock the.** datab
13ac0 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ase then the IO 
13ad0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
13ae0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
13af0 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f  er. If the .** o
13b00 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61  peration to fina
13b10 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
13b20 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65   file fails, the
13b30 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c  n the code still
13b40 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c  .** tries to unl
13b50 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
13b60 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20   file if not in 
13b70 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20  exclusive mode. 
13b80 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b  If the.** unlock
13b90 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73   operation fails
13ba0 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74   as well, then t
13bb0 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63  he first error c
13bc0 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74  ode related.** t
13bd0 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  o the first erro
13be0 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74  r encountered (t
13bf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  he journal final
13c00 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a  ization one) is.
13c10 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
13c20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
13c30 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
13c40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13c50 69 6e 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69  int hasMaster, i
13c60 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69  nt bCommit){.  i
13c70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13c80 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  K;      /* Error
13c90 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e   code from journ
13ca0 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13cb0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
13cc0 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
13cd0 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  OK;     /* Error
13ce0 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69   code from db fi
13cf0 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  le unlock operat
13d00 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20  ion */..  /* Do 
13d10 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 70  nothing if the p
13d20 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
13d30 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
13d40 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
13d50 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20  * or at least a 
13d60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54  RESERVED lock. T
13d70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
13d80 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
13d90 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
13da0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13db0 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20 61 20  on active but a 
13dc0 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
13dd0 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a  ter lock is.  **
13de0 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20   held under two 
13df0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20  circumstances:. 
13e00 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66   **.  **   1. Af
13e10 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c  ter a successful
13e20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
13e30 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c  lback, it is cal
13e40 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20  led with.  **   
13e50 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52     eState==PAGER
13e60 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d  _NONE and eLock=
13e70 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e  =EXCLUSIVE_LOCK.
13e80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
13e90 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  If a connection 
13ea0 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  with locking_mod
13eb0 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64  e=exclusive hold
13ec0 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
13ed0 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b   .  **      lock
13ee0 20 73 77 69 74 63 68 65 73 20 62 61 63 6b 20 74   switches back t
13ef0 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e  o locking_mode=n
13f00 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65  ormal and then e
13f10 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20  xecutes a.  **  
13f20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63      read-transac
13f30 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74  tion, this funct
13f40 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ion is called wi
13f50 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52  th eState==PAGER
13f60 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20  _READER .  **   
13f70 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58     and eLock==EX
13f80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65  CLUSIVE_LOCK whe
13f90 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  n the read-trans
13fa0 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64  action is closed
13fb0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13fc0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
13fd0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
13fe0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13ff0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
14000 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50  RROR );.  if( pP
14010 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
14020 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
14030 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
14040 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  k<RESERVED_LOCK 
14050 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14060 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
14070 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
14080 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ints(pPager);.  
14090 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
140a0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
140b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
140c0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
140d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
140e0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
140f0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
14100 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
14110 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   Finalize the jo
14120 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
14130 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f     if( sqlite3Jo
14140 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
14150 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
14160 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
14170 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14180 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14190 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
141a0 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
141b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
141c0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
141d0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
141e0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
141f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
14200 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
14210 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14220 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
14230 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14240 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
14250 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14260 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
14270 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
14280 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
14290 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
142a0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
142b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
142c0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
142d0 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72   file size is wr
142e0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
142f0 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61 79 2e  node right away.
14300 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  .          ** Ot
14310 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72  herwise the jour
14320 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72  nal might resurr
14330 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ect following a 
14340 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20  power loss and. 
14350 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73           ** caus
14360 65 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73  e the last trans
14370 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62  action to roll b
14380 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20  ack.  See.      
14390 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62      ** https://b
143a0 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e  ugzilla.mozilla.
143b0 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  org/show_bug.cgi
143c0 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20  ?id=1072773.    
143d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
143e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
143f0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
14400 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
14410 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d  lags);.        }
14420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14440 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
14450 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
14460 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14470 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
14480 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
14490 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
144a0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
144b0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
144c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
144d0 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
144e0 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
144f0 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
14500 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50  aster);.      pP
14510 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14520 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
14530 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
14540 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
14550 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
14560 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
14570 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
14580 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
14590 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
145a0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
145b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
145c0 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
145d0 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
145e0 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
145f0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
14600 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
14610 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14620 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
14630 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
14640 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ory journal..   
14650 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
14660 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65  bDelete = !pPage
14670 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20  r->tempFile;.   
14680 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14690 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
146a0 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ory(pPager->jfd)
146b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
146c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
146d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
146e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
146f0 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
14700 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
14710 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14720 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
14730 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
14740 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14750 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14760 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
14770 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14780 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
14790 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
147a0 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20   bDelete ){.    
147b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
147c0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
147d0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
147e0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
147f0 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20  >extraSync);.   
14800 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14810 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
14820 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69  ECK_PAGES.  sqli
14830 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
14840 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
14850 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74  Cache, pager_set
14860 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66  _pagehash);.  if
14870 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
14880 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63  ==0 && sqlite3Pc
14890 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
148a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
148b0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
148c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
148d0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b  okup(pPager, 1);
148e0 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
148f0 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20      p->pageHash 
14900 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
14910 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
14920 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ull(p);.    }.  
14930 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 61 67 65  }.#endif..  page
14940 72 46 72 65 65 42 69 74 76 65 63 73 28 70 50 61  rFreeBitvecs(pPa
14950 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
14960 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
14970 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
14980 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
14990 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
149a0 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
149b0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
149c0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
149d0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
149e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
149f0 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
14a00 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
14a10 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
14a20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
14a30 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
14a40 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14a50 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
14a60 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
14a70 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
14a80 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
14a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14aa0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
14ab0 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
14ac0 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
14ad0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
14ae0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
14af0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
14b00 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
14b10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
14b20 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e  mmit && pPager->
14b30 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65  dbFileSize>pPage
14b40 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
14b50 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14b60 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f  is taken when co
14b70 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
14b80 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61  action in rollba
14b90 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ck-journal.    *
14ba0 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61  * mode if the da
14bb0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
14bc0 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68  isk is larger th
14bd0 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
14be0 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74  image..    ** At
14bf0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
14c00 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
14c10 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74   finalized and t
14c20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
14c30 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
14c40 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62  lly committed, b
14c50 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  ut the EXCLUSIVE
14c60 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68   lock is still h
14c70 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  eld on the.    *
14c80 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73  * file. So it is
14c90 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74   safe to truncat
14ca0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
14cb0 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ile to its minim
14cc0 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  um.    ** requir
14cd0 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ed size.  */.   
14ce0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14cf0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
14d00 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  E_LOCK );.    rc
14d10 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
14d20 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
14d30 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
14d40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14d50 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14d60 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
14d70 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  >fd) ){.    rc =
14d80 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
14d90 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
14da0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
14db0 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
14dc0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
14dd0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14de0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14df0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
14e00 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14e10 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
14e20 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14e30 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
14e40 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
14e50 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
14e60 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
14e70 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
14e80 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
14e90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
14ea0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
14eb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
14ec0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
14ed0 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
14ee0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
14ef0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
14f00 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
14f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
14f20 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
14f30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14f40 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
14f50 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
14f60 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
14f70 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
14f80 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
14f90 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
14fa0 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
14fb0 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
14fc0 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
14fd0 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
14fe0 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
14ff0 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
15000 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
15010 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
15020 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
15030 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
15040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15050 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
15060 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
15070 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
15080 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
15090 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
150a0 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
150b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
150c0 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
150d0 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
150e0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
150f0 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
15100 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
15110 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
15120 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
15130 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
15140 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
15150 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
15160 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
15170 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
15180 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
15190 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
151a0 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
151b0 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
151c0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
151d0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
151e0 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
151f0 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
15200 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
15210 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
15220 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
15230 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
15240 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
15250 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
15260 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
15270 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
15280 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
15290 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
152a0 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
152b0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
152c0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
152d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
152e0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
152f0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
15300 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
15310 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
15320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
15330 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
15340 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
15350 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
15360 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
15370 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
15380 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
15390 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
153a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
153b0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
153c0 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
153d0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
153e0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
153f0 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
15400 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
15410 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
15420 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
15430 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
15440 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
15450 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
15460 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
15470 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
15480 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
15490 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
154a0 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
154b0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
154c0 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
154d0 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
154e0 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
154f0 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
15500 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
15510 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
15520 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
15530 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
15540 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
15550 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
15560 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
15570 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
15580 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
15590 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
155a0 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
155b0 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
155c0 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
155d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
155e0 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
155f0 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
15600 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
15610 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
15620 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
15630 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
15640 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15650 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15660 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
15670 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
15680 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
15690 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
156a0 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
156b0 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
156c0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
156d0 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
156e0 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
156f0 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
15700 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
15710 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
15720 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
15730 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
15740 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15750 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15760 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
15770 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
15780 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
15790 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
157a0 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
157b0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
157c0 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
157d0 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
157e0 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
157f0 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
15800 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15810 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
15820 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
15830 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15840 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
15850 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
15860 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15870 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
15880 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
15890 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
158a0 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
158b0 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
158c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
158d0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
158e0 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
158f0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
15900 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
15910 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
15920 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
15930 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
15940 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15950 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15960 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
15970 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
15980 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
15990 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
159a0 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
159b0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
159e0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
159f0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
15a00 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
15a10 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
15a20 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
15a30 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
15a40 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c */.#endif..#if
15a50 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15a60 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ODEC./*.** Make 
15a70 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
15a80 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
15a90 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
15aa0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
15ab0 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69  ** pager as it i
15ac0 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e  s in the source.
15ad0 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20    This comes up 
15ae0 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68  when a VACUUM ch
15af0 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  anges the.** num
15b00 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15b10 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74  bits to the "opt
15b20 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f  imal" amount..*/
15b30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15b40 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50  erAlignReserve(P
15b50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67  ager *pDest, Pag
15b60 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28  er *pSrc){.  if(
15b70 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
15b80 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  !=pSrc->nReserve
15b90 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e   ){.    pDest->n
15ba0 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e  Reserve = pSrc->
15bb0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
15bc0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44  gerReportSize(pD
15bd0 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  est);.  }.}.#end
15be0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
15bf0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
15c00 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
15c10 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
15c20 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
15c30 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
15c40 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
15c50 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
15c60 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
15c70 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
15c80 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
15c90 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
15ca0 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
15cb0 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
15cc0 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
15cd0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
15ce0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
15cf0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
15d00 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
15d10 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
15d20 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
15d30 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15d40 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
15d50 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15d60 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
15d70 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
15d80 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15d90 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
15da0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
15db0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
15dc0 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
15dd0 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
15de0 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
15df0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15e00 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
15e10 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
15e20 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
15e30 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
15e40 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
15e50 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
15e60 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
15e70 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
15e80 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15e90 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
15ea0 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
15eb0 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
15ec0 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
15ed0 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
15ee0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15ef0 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
15f00 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
15f10 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
15f20 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
15f30 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
15f40 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
15f50 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
15f60 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
15f70 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15f80 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
15f90 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
15fa0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
15fb0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
15fc0 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
15fd0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
15fe0 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
15ff0 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
16000 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
16010 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
16020 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
16030 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
16040 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
16050 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
16060 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
16070 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
16080 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
16090 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
160a0 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
160b0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
160c0 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
160d0 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
160e0 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
160f0 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
16100 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
16110 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
16120 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
16130 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
16140 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
16150 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
16160 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
16170 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
16180 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
16190 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
161a0 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
161b0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
161c0 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
161d0 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
161e0 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
161f0 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
16200 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
16210 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
16220 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
16230 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
16240 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
16250 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
16260 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
16270 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
16280 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
16290 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
162a0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
162b0 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
162c0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
162d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
162e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
162f0 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
16300 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
16310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16320 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
16330 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
16340 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
16350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16360 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
16370 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
16380 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
163a0 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
163b0 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
163c0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
163d0 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
163e0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
163f0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
16400 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
16410 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
16420 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
16430 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
16440 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
16450 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
16460 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
16470 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
16480 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
16490 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
164a0 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
164b0 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
164c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
164d0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
164e0 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
164f0 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16510 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
16520 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
16530 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
16540 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
16550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16560 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
16570 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
16580 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16590 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
165a0 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
165b0 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
165c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
165d0 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
16600 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
16610 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
16620 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d  (isMainJrnl&~1)=
16630 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73  =0 );      /* is
16640 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72  MainJrnl is 0 or
16650 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
16660 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d  (isSavepnt&~1)==
16670 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73  0 );       /* is
16680 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20  Savepnt is 0 or 
16690 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  1 */.  assert( i
166a0 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f  sMainJrnl || pDo
166b0 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f  ne );     /* pDo
166c0 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f  ne always used o
166d0 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  n sub-journals *
166e0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
166f0 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d  vepnt || pDone==
16700 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20  0 );   /* pDone 
16710 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f  never used on no
16720 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a  n-savepoint */..
16730 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72    aData = pPager
16740 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
16750 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
16760 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
16770 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
16780 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
16790 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73  llocated */.  as
167a0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
167b0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
167c0 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  (!isMainJrnl && 
167d0 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20  isSavepnt) );.. 
167e0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73   /* Either the s
167f0 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20  tate is greater 
16800 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45  than PAGER_WRITE
16810 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72  R_CACHEMOD (a tr
16820 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
16830 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
16840 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68  lback done at th
16850 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65  e request of the
16860 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73   caller) or this
16870 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   is.  ** a hot-j
16880 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
16890 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d   If it is a hot-
168a0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
168b0 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  , the pager.  **
168c0 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45   is in state OPE
168d0 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45  N and holds an E
168e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48  XCLUSIVE lock. H
168f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16900 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65  ack.  ** only re
16910 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ads from the mai
16920 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74  n journal, not t
16930 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
16940 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16950 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16960 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16970 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28  EMOD.       || (
16980 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
16990 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50  PAGER_OPEN && pP
169a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
169b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
169c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
169d0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
169e0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
169f0 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  D || isMainJrnl 
16a00 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  );..  /* Read th
16a10 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
16a20 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
16a30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
16a40 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
16a50 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
16a60 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
16a70 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
16a80 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
16a90 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
16aa0 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
16ab0 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
16ac0 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
16ad0 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
16ae0 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
16af0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16b00 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16b10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
16b20 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
16b30 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
16b40 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
16b50 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
16b60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16b70 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
16b80 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
16b90 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
16ba0 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
16bb0 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
16bc0 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
16bd0 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
16be0 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
16bf0 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
16c00 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
16c10 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
16c20 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
16c30 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
16c40 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
16c50 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
16c60 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
16c70 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
16c80 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
16c90 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
16ca0 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
16cb0 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
16cc0 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
16cd0 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
16ce0 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
16cf0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
16d00 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
16d10 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
16d20 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
16d30 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16d40 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
16d50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
16d60 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
16d70 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
16d80 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
16d90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16da0 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
16db0 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
16dc0 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
16dd0 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
16de0 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
16df0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16e00 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
16e10 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
16e20 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
16e30 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
16e40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16e50 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
16e60 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
16e70 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
16e80 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
16e90 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20  k before during 
16ea0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
16eb0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
16ec0 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20  don't bother to 
16ed0 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61  play it back aga
16ee0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
16ef0 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
16f00 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
16f10 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51  Done, pgno))!=SQ
16f20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16f30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16f40 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
16f50 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65   back page 1, re
16f60 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72  store the nReser
16f70 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  ve setting.  */.
16f80 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26    if( pgno==1 &&
16f90 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
16fa0 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b  e!=((u8*)aData)[
16fb0 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65  20] ){.    pPage
16fc0 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28  r->nReserve = ((
16fd0 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a  u8*)aData)[20];.
16fe0 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
16ff0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
17000 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
17010 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d  ger is in CACHEM
17020 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  OD state, then t
17030 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
17040 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
17050 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
17060 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
17070 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
17080 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
17090 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
170a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
170b0 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
170c0 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
170d0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
170e0 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
170f0 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
17100 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
17110 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
17120 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
17130 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
17140 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
17150 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
17160 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
17170 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
17180 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
17190 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
171a0 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
171b0 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
171c0 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
171d0 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
171e0 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
171f0 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
17200 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
17210 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
17220 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
17230 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
17240 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
17250 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
17260 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42   If in WRITER_DB
17270 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49  MOD, WRITER_FINI
17280 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  SHED or OPEN sta
17290 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
172a0 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  te the.  ** page
172b0 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
172c0 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69  ists and the mai
172d0 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
172e0 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
172f0 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e  .  ** not dirty.
17300 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65   Since this code
17310 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65   is only execute
17320 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  d in PAGER_OPEN 
17330 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61  state for.  ** a
17340 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
17350 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61  lback, it is gua
17360 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
17370 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65   page-cache is e
17380 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65  mpty.  ** if the
17390 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45   pager is in OPE
173a0 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20  N state..  **.  
173b0 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
173c0 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
173d0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
173e0 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
173f0 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
17400 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
17410 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
17420 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
17430 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
17440 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
17450 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
17460 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
17470 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
17480 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
17490 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
174a0 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
174b0 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
174c0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
174d0 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
174e0 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
174f0 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
17500 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
17510 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
17520 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
17530 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
17540 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
17550 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
17560 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
17570 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
17580 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
17590 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
175a0 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
175b0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
175c0 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
175d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
175e0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
175f0 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
17600 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
17610 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
17620 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
17630 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
17640 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
17650 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
17660 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
17670 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
17680 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
17690 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
176a0 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
176b0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
176c0 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
176d0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
176e0 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
176f0 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
17700 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
17710 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
17720 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
17730 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
17740 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
17750 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
17760 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
17770 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
17780 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
17790 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
177a0 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
177b0 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
177c0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
177d0 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
177e0 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
177f0 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
17800 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
17810 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
17820 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72    */.  if( pager
17830 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17840 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
17850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20   }else{.    pPg 
17860 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
17870 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
17880 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  o);.  }.  assert
17890 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20  ( pPg || !MEMDB 
178a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
178b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
178c0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d  ER_OPEN || pPg==
178d0 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
178e0 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
178f0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
17900 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
17910 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
17920 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
17930 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
17940 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
17950 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
17960 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
17970 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
17980 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
17990 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
179a0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
179b0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
179c0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
179d0 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
179e0 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
179f0 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
17a00 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
17a10 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
17a20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
17a30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
17a40 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
17a50 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
17a60 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
17a70 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
17a80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
17a90 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
17aa0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
17ab0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
17ac0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
17ad0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
17ae0 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
17af0 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
17b00 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
17b10 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
17b20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17b30 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17b40 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
17b50 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
17b60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
17b70 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
17b80 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
17b90 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
17ba0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
17bb0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
17bc0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
17bd0 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
17be0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
17bf0 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
17c00 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
17c10 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
17c20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
17c30 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
17c40 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
17c50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
17c60 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
17c70 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  ;.      CODEC2(p
17c80 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
17c90 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45  no, 7, rc=SQLITE
17ca0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61  _NOMEM_BKPT, aDa
17cb0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ta);.    }.  }el
17cc0 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72  se if( !isMainJr
17cd0 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a  nl && pPg==0 ){.
17ce0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
17cf0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  s a rollback of 
17d00 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  a savepoint and 
17d10 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69  data was not wri
17d20 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74  tten to.    ** t
17d30 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
17d40 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
17d50 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65  in-memory, there
17d60 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a   is a potential.
17d70 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20      ** problem. 
17d80 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  When the page is
17d90 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79   next fetched by
17da0 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
17db0 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  r, it .    ** wi
17dc0 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
17dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17de0 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  e, which may or 
17df0 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  may not be .    
17e00 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20  ** current. .   
17e10 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65   **.    ** There
17e20 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66   are a couple of
17e30 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20   different ways 
17e40 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e  this can happen.
17e50 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20   All are quite. 
17e60 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57     ** obscure. W
17e70 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73  hen running in s
17e80 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
17e90 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   this can only h
17ea0 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66  appen .    ** if
17eb0 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20   the page is on 
17ec0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74  the free-list at
17ed0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
17ee0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
17ef0 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  hen.    ** popul
17f00 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64  ated, then moved
17f10 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
17f20 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20  gerMovepage().. 
17f30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
17f40 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
17f50 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  add an in-memory
17f60 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63   page to the cac
17f70 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  he containing.  
17f80 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75    ** the data ju
17f90 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  st read from the
17fa0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61   sub-journal. Ma
17fb0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
17fc0 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64  irty .    ** and
17fd0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65   if the pager re
17fe0 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c  quires a journal
17ff0 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b  -sync, then mark
18000 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20   the page as .  
18010 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61    ** requiring a
18020 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65   journal-sync be
18030 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74  fore it is writt
18040 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  en..    */.    a
18050 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
18060 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18070 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
18080 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
18090 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a  ROLLBACK)==0 );.
180a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
180b0 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46  tSpill |= SPILLF
180c0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  LAG_ROLLBACK;.  
180d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
180e0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
180f0 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
18100 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
18110 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
18120 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18130 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  ACK)!=0 );.    p
18140 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18150 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f  l &= ~SPILLFLAG_
18160 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66  ROLLBACK;.    if
18170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18180 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
18190 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
181a0 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
181b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
181c0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
181d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
181e0 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
181f0 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
18200 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
18210 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
18220 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
18230 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
18240 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
18250 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
18260 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
18270 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
18280 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
18290 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
182a0 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
182b0 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
182c0 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
182d0 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
182e0 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
182f0 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
18300 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
18310 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
18320 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
18330 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
18340 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
18350 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
18360 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
18370 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18380 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
18390 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
183a0 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  if( isMainJrnl &
183b0 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c  & (!isSavepnt ||
183c0 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65   *pOffset<=pPage
183d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29  r->journalHdr) )
183e0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
183f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
18400 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75 73  is page were jus
18410 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20  t restored from 
18420 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20  the main .      
18430 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
18440 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e   then its conten
18450 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68 65  t must be as the
18460 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65 20  y were when the 
18470 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
18480 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20  ction was first 
18490 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
184a0 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b  case we can mark
184b0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
184c0 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e  ** as clean, sin
184d0 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ce there will be
184e0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74   no need to writ
184f0 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a  e it out to the.
18500 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
18510 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
18520 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
18530 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
18540 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
18550 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
18560 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
18570 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
18580 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
18590 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
185a0 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
185b0 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
185c0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
185d0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
185e0 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
185f0 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
18600 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
18610 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
18620 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
18630 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
18640 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
18650 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
18660 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
18670 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
18680 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
18690 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
186a0 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
186b0 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
186c0 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
186d0 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
186e0 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
186f0 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
18700 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
18710 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
18720 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
18730 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
18740 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
18750 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
18760 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
18770 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
18780 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
18790 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
187a0 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
187b0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
187c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
187d0 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
187e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
187f0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
18800 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
18810 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
18820 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
18830 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
18840 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
18850 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
18860 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
18870 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
18880 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
18890 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
188a0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
188b0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
188c0 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
188d0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
188e0 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
188f0 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
18900 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
18910 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
18920 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
18930 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
18940 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
18950 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
18960 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
18970 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
18980 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
18990 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
189a0 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
189b0 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
189c0 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
189d0 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
189e0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
189f0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
18a00 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18a10 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73 71 6c  M_BKPT);.    sql
18a20 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
18a30 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
18a40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18a50 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
18a60 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
18a70 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
18a80 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
18a90 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
18aa0 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
18ab0 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
18ac0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
18ad0 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
18ae0 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
18af0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
18b00 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
18b10 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
18b20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18b30 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
18b40 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
18b50 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
18b60 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
18b70 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
18b80 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
18b90 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
18ba0 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
18bb0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
18bc0 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
18bd0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18be0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
18bf0 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
18c00 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
18c10 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
18c20 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
18c30 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
18c40 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
18c50 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
18c60 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
18c70 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
18c80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
18c90 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
18ca0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
18cb0 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
18cc0 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
18cd0 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
18ce0 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
18cf0 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
18d00 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
18d10 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
18d20 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
18d30 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
18d40 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
18d50 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
18d60 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
18d70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18d80 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
18d90 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
18da0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
18db0 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
18dc0 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
18dd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
18de0 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
18df0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
18e00 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
18e10 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
18e20 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
18e30 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
18e40 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
18e50 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
18e60 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
18e70 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
18e80 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
18e90 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
18ea0 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
18eb0 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
18ec0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
18ed0 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
18ee0 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
18ef0 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
18f00 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
18f10 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
18f20 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
18f30 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
18f40 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
18f50 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
18f60 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
18f70 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
18f80 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
18f90 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
18fa0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
18fb0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
18fc0 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
18fd0 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
18fe0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
18ff0 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
19000 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
19010 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
19020 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
19030 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
19040 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
19050 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
19060 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
19070 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
19080 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
19090 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
190a0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
190b0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
190c0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
190d0 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
190e0 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
190f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
19100 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
19110 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
19120 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
19130 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
19140 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
19150 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
19160 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
19170 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
19180 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
19190 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
191a0 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
191b0 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
191c0 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
191d0 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
191e0 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
191f0 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
19200 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
19210 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
19220 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
19230 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
19240 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
19250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19260 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
19270 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
19280 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
19290 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
192a0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
192b0 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
192c0 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
192d0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
192e0 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
192f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
19300 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
19310 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
19320 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
19330 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
19340 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
19350 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
19360 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
19370 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19380 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
19390 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
193a0 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
193b0 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
193c0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
193d0 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
193e0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
193f0 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
19400 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
19410 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
19420 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
19430 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
19440 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
19450 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
19460 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
19470 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
19480 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
19490 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
194a0 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
194b0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
194c0 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
194d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
194e0 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
194f0 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
19500 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
19510 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
19520 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
19530 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
19540 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
19550 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
19560 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
19570 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
19580 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
19590 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
195a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
195b0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
195c0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
195d0 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
195e0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
195f0 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
19600 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
19610 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
19620 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
19630 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19640 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19650 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
19660 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
19670 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19680 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
19690 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
196a0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
196b0 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
196c0 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
196d0 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
196e0 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
196f0 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
19700 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
19710 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
19720 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
19730 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
19740 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
19750 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
19760 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
19770 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
19780 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
19790 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
197a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
197b0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
197c0 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
197d0 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
197e0 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
197f0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
19800 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  ite3Malloc(nMast
19810 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
19820 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
19830 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
19840 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
19850 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
19860 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61  ;.    goto delma
19870 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  ster_out;.  }.  
19880 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
19890 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
198a0 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
198b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
198c0 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
198d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
198e0 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
198f0 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  l, 0);.  if( rc!
19900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19910 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19920 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
19930 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
19940 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e  ] = 0;..  zJourn
19950 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
19960 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a  nal;.  while( (z
19970 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
19980 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
19990 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
199a0 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63  t exists;.    rc
199b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
199c0 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
199d0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
199e0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
199f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19a00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19a10 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19a20 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
19a30 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
19a40 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
19a50 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
19a60 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
19a70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
19a80 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65  ts..      ** Ope
19a90 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
19aa0 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
19ab0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19ac0 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73  l. If.      ** s
19ad0 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
19ae0 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
19af0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19b00 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
19b10 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
19b20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
19b30 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
19b40 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
19b50 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
19b60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19b70 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
19b80 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
19b90 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
19ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19bb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
19bc0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19bd0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19be0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
19bf0 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
19c00 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
19c10 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
19c20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19c30 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
19c40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19c50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
19c60 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19c70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19c80 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
19c90 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
19ca0 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
19cb0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  ter)==0;.      i
19cc0 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
19cd0 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
19ce0 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
19cf0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
19d00 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
19d10 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19d20 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19d30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
19d40 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
19d50 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
19d60 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73  l)+1);.  }. .  s
19d70 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
19d80 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  aster);.  rc = s
19d90 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
19da0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
19db0 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
19dc0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
19dd0 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
19de0 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20  ;.  if( pMaster 
19df0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
19e00 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
19e10 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
19e20 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b  pen(pJournal) );
19e30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
19e40 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
19e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19e60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19e70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
19e80 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
19e90 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
19ea0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
19eb0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
19ec0 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
19ed0 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
19ee0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
19ef0 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
19f00 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
19f10 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
19f20 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
19f30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
19f40 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
19f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19f60 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68   not open, or th
19f70 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
19f80 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f  n either.** DBMO
19f90 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
19fa0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19fb0 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
19fc0 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a  wise, the size .
19fd0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
19fe0 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61  s changed to nPa
19ff0 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a  ge pages (nPage*
1a000 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a010 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20   bytes). .** If 
1a020 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1a030 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
1a040 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
1a050 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
1a060 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
1a070 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
1a080 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
1a090 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
1a0a0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1a0b0 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
1a0c0 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
1a0d0 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
1a0e0 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
1a0f0 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
1a100 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
1a110 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
1a120 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
1a130 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
1a140 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
1a150 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
1a160 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
1a170 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
1a180 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
1a190 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
1a1a0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
1a1b0 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
1a1c0 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
1a1d0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1a1e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a1f0 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
1a200 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
1a210 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
1a220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
1a230 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
1a240 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
1a250 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a260 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
1a270 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a280 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
1a290 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a2a0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
1a2b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
1a2c0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
1a2d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1a2e0 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
1a2f0 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
1a300 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a310 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
1a320 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1a330 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1a340 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1a350 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
1a360 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
1a370 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
1a380 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
1a390 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a3a0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1a3b0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
1a3c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
1a3d0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
1a3e0 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
1a3f0 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
1a400 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
1a410 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a420 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1a430 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
1a440 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
1a450 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
1a460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a470 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
1a480 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
1a490 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
1a4a0 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
1a4b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1a4c0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1a4d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
1a4e0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
1a4f0 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53  se if( (currentS
1a500 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77  ize+szPage)<=new
1a510 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1a520 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61  char *pTmp = pPa
1a530 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1a540 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1a550 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b  Tmp, 0, szPage);
1a560 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a570 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
1a580 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
1a590 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
1a5a0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1a5b0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
1a5c0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1a5d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a5e0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1a5f0 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
1a600 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
1a610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a630 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1a640 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1a650 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
1a660 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a680 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69   Return a saniti
1a690 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
1a6a0 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f  he sector-size o
1a6b0 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e  f OS file pFile.
1a6c0 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
1a6d0 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65  alue is guarante
1a6e0 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65  ed to lie betwee
1a6f0 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43  n 32 and MAX_SEC
1a700 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74  TOR_SIZE..*/.int
1a710 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1a720 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1a730 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69  *pFile){.  int i
1a740 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  Ret = sqlite3OsS
1a750 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29  ectorSize(pFile)
1a760 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20  ;.  if( iRet<32 
1a770 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31  ){.    iRet = 51
1a780 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  2;.  }else if( i
1a790 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  Ret>MAX_SECTOR_S
1a7a0 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
1a7b0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
1a7c0 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69  ZE>=512 );.    i
1a7d0 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  Ret = MAX_SECTOR
1a7e0 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
1a7f0 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
1a800 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
1a810 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
1a820 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1a830 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
1a840 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
1a850 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
1a860 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
1a870 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
1a880 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
1a890 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1a8a0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1a8b0 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  l be used .** to
1a8c0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1a8d0 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
1a8e0 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
1a8f0 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
1a900 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
1a910 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
1a920 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
1a930 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
1a940 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
1a950 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a960 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
1a970 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
1a980 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1a990 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
1a9a0 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
1a9b0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1a9c0 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
1a9d0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
1a9e0 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
1a9f0 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
1aa00 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
1aa10 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
1aa20 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
1aa30 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
1aa40 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
1aa50 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
1aa60 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a  ECTOR_SIZE..**.*
1aa70 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
1aa80 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  s the SQLITE_IOC
1aa90 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1aaa0 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c  RWRITE property,
1aab0 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65   then set.** the
1aac0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1aad0 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69  r size to its mi
1aae0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32  nimum value (512
1aaf0 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  ).  The purpose 
1ab00 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65  of.** pPager->se
1ab10 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64  ctorSize is to d
1ab20 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74  efine the "blast
1ab30 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65   radius" of byte
1ab40 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  s that.** might 
1ab50 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73  change if a cras
1ab60 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77  h occurs while w
1ab70 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67  riting to a sing
1ab80 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68  le byte in.** th
1ab90 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77  at range.  But w
1aba0 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ith POWERSAFE_OV
1abb0 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61  ERWRITE, the bla
1abc0 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72  st radius is zer
1abd0 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68  o.** (that is wh
1abe0 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  at POWERSAFE_OVE
1abf0 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73  RWRITE means), s
1ac00 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  o we minimize th
1ac10 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65  e sector.** size
1ac20 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  .  For backwards
1ac30 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f   compatibility o
1ac40 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1ac50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1ac60 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74  at,.** we cannot
1ac70 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1ac80 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1ac90 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a  e below 512..*/.
1aca0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
1acb0 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
1acc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
1acd0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1ace0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1acf0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
1ad00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
1ad10 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c  pFile.   || (sql
1ad20 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1ad30 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1ad40 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20  er->fd) & .     
1ad50 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1ad60 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1ad70 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20  OVERWRITE)!=0.  
1ad80 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
1ad90 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
1ada0 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
1adb0 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
1adc0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
1add0 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
1ade0 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
1adf0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
1ae00 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
1ae10 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
1ae20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20  segfault. */.   
1ae30 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1ae40 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  ize = 512;.  }el
1ae50 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
1ae60 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
1ae70 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70  ite3SectorSize(p
1ae80 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
1ae90 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
1aea0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
1aeb0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
1aec0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1aed0 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
1aee0 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
1aef0 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
1af00 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
1af10 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
1af20 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
1af30 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
1af40 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
1af50 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
1af60 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
1af70 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
1af80 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1af90 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1afa0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
1afb0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
1afc0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
1afd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
1afe0 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
1aff0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
1b000 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
1b010 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
1b020 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1b030 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
1b040 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
1b050 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1b060 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1b070 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
1b080 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
1b090 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
1b0a0 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
1b0b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b0c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1b0d0 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
1b0e0 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
1b0f0 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
1b100 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
1b110 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
1b120 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1b130 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
1b140 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
1b150 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
1b160 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
1b170 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
1b180 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
1b190 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1b1a0 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
1b1b0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20   size..**  (7)  
1b1c0 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74  zero padding out
1b1d0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
1b1e0 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38  tor size..**  (8
1b1f0 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
1b200 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
1b210 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
1b220 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
1b230 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
1b240 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
1b250 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b260 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
1b270 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1b280 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
1b290 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
1b2a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b2b0 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
1b2c0 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d  the first 7 item
1b2d0 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
1b2e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
1b2f0 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
1b300 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20  ance of the 8th 
1b310 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
1b320 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
1b330 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
1b340 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
1b350 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b360 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
1b370 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
1b380 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
1b390 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
1b3a0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
1b3b0 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
1b3c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b3d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b3e0 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
1b3f0 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
1b400 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
1b410 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
1b420 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
1b430 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
1b440 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
1b450 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b460 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
1b470 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
1b480 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
1b490 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
1b4a0 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
1b4b0 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
1b4c0 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
1b4d0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1b4e0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
1b4f0 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
1b500 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
1b510 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
1b520 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
1b530 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
1b540 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
1b550 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
1b560 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
1b570 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
1b580 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
1b590 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
1b5a0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1b5b0 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
1b5c0 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
1b5d0 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
1b5e0 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
1b5f0 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
1b600 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
1b610 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
1b620 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
1b630 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
1b640 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
1b650 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
1b660 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
1b670 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
1b680 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
1b690 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
1b6a0 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
1b6b0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
1b6c0 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
1b6d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1b6e0 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
1b6f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1b700 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
1b710 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
1b720 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
1b730 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
1b740 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
1b750 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1b760 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
1b770 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b780 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
1b790 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
1b7a0 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
1b7b0 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
1b7c0 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
1b7d0 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
1b7e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
1b7f0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1b800 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
1b810 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
1b820 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
1b830 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1b840 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1b850 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
1b860 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
1b870 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
1b880 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
1b890 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
1b8a0 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
1b8b0 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
1b8c0 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
1b8d0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
1b8e0 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
1b8f0 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
1b900 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
1b910 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1b920 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
1b930 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
1b940 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
1b950 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
1b960 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
1b970 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
1b980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b990 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
1b9a0 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
1b9b0 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
1b9c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
1b9d0 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
1b9e0 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
1b9f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1ba00 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1ba10 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1ba40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
1ba50 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
1ba60 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1ba70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ba80 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
1ba90 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1baa0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1bab0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1bac0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1bad0 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
1bae0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1baf0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
1bb00 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
1bb10 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1bb40 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
1bb50 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
1bb60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1bb70 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1bb80 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
1bb90 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
1bba0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
1bbb0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
1bbc0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1bbd0 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
1bbe0 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
1bbf0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
1bc00 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
1bc10 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
1bc20 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   rollback */.  i
1bc30 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30  nt nPlayback = 0
1bc40 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ;       /* Total
1bc50 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1bc60 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a   restored from j
1bc70 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ournal */..  /* 
1bc80 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1bc90 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1bca0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1bcb0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1bcc0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1bcd0 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1bce0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1bcf0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1bd00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1bd10 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1bd20 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1bd30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bd40 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1bd50 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1bd60 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1bd70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1bd80 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1bd90 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1bda0 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1bdb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bdc0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1bdd0 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1bde0 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1bdf0 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1be00 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1be10 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1be20 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1be30 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1be40 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1be50 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1be60 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1be70 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1be80 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1be90 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1bea0 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1beb0 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1bec0 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1bed0 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1bee0 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1bef0 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1bf00 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1bf10 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1bf20 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61  nix.c,.  ** mxPa
1bf30 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
1bf40 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
1bf50 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
1bf60 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
1bf70 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
1bf80 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
1bf90 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1bfa0 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
1bfb0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1bfc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1bfd0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1bfe0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1bff0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1c000 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1c010 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
1c020 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1c030 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1c040 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1c050 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
1c060 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
1c070 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c080 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
1c090 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c0a0 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
1c0b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1c0c0 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
1c0d0 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
1c0e0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
1c0f0 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
1c100 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
1c110 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
1c120 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1c130 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
1c140 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1c150 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
1c160 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
1c170 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
1c180 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
1c190 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
1c1a0 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
1c1b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1c1c0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
1c1d0 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
1c1e0 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
1c1f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1c200 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
1c210 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
1c220 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
1c230 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
1c240 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c250 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
1c260 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
1c270 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
1c280 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
1c290 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
1c2a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
1c2b0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1c2c0 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
1c2d0 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
1c2e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c2f0 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
1c300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c310 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1c340 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c350 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c360 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
1c370 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
1c380 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
1c390 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1c3a0 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
1c3b0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
1c3c0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1c3d0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1c3e0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1c3f0 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
1c400 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
1c410 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
1c420 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
1c430 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
1c440 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
1c450 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
1c460 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1c470 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
1c480 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
1c490 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1c4a0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1c4b0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1c4c0 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
1c4d0 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
1c4e0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c4f0 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
1c500 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1c510 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c520 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
1c530 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
1c540 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1c550 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
1c560 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1c570 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
1c580 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
1c590 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
1c5a0 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
1c5b0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
1c5c0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1c5d0 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
1c5e0 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
1c5f0 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
1c600 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
1c610 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
1c620 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
1c630 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
1c640 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
1c650 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
1c660 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
1c670 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
1c680 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
1c690 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
1c6a0 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
1c6b0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1c6c0 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
1c6d0 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
1c6e0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
1c6f0 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
1c700 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
1c710 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
1c720 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1c730 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
1c740 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
1c750 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
1c760 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
1c770 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
1c780 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
1c790 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1c7a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1c7b0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
1c7c0 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
1c7d0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1c7e0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1c7f0 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
1c800 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
1c810 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
1c820 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
1c830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c840 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1c850 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
1c860 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
1c870 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1c880 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1c890 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1c8a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c8b0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
1c8c0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
1c8d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c8e0 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
1c8f0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1c900 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1c910 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
1c920 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
1c930 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
1c940 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
1c950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1c960 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
1c970 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
1c980 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1c990 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1c9a0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1c9b0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1c9c0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
1c9d0 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
1c9e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c9f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ca00 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1ca10 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
1ca20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1ca30 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
1ca40 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
1ca50 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
1ca60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1ca70 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
1ca80 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
1ca90 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
1caa0 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
1cab0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
1cac0 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
1cad0 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
1cae0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
1caf0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1cb00 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
1cb10 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
1cb20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cb30 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1cb40 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1cb50 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
1cb60 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
1cb70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1cb80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cb90 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a     nPlayback++;.
1cba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cbb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1cbc0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1cbd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1cbe0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1cbf0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1cc00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1cc10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1cc20 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1cc30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1cc40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1cc50 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1cc60 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1cc70 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1cc80 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1cc90 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1cca0 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1ccb0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1ccc0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1ccd0 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1cce0 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1ccf0 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1cd00 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1cd10 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1cd20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1cd30 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1cd40 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1cd50 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1cd60 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1cd70 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1cd80 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1cd90 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1cda0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cdb0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1cdc0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1cdd0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1cde0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1cdf0 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1ce00 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1ce10 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1ce20 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1ce30 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1ce40 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1ce50 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1ce60 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1ce70 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1ce80 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1ce90 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1cea0 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1ceb0 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1cec0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1ced0 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1cee0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1cef0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1cf00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1cf10 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1cf20 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1cf30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cf40 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1cf50 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1cf60 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1cf70 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
1cf80 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1cf90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1cfa0 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1cfb0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1cfc0 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1cfd0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1cfe0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1cff0 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1d000 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1d010 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1d020 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1d030 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1d040 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1d050 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1d060 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1d070 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1d080 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d090 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  UG.  if( pPager-
1d0a0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1d0b0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1d0c0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1d0d0 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1d0e0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d0f0 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ED,0);.  }.#endi
1d100 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1d110 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1d120 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1d130 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1d140 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1d150 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1d160 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1d170 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1d180 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1d190 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1d1a0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1d1b0 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1d1c0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1d1d0 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1d1e0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1d1f0 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1d200 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1d210 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1d220 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1d230 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1d240 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1d250 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1d260 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1d270 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1d280 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d290 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1d2a0 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1d2b0 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1d2c0 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1d2d0 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1d2e0 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1d2f0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1d300 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1d310 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1d320 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1d330 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1d340 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1d350 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1d360 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1d370 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1d380 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1d3a0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1d3b0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1d3c0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1d3d0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1d3e0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1d3f0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1d400 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1d410 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d420 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1d440 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1d450 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1d460 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1d470 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1d480 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1d490 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d4a0 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29  rSync(pPager, 0)
1d4b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d4c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d4d0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1d4e0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1d4f0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1d500 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1d510 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1d520 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1d530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d540 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1d550 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1d560 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1d570 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1d580 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1d590 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1d5a0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1d5b0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1d5c0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1d5d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1d5e0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1d5f0 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1d600 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1d610 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1d620 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1d630 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1d640 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1d650 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1d660 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1d670 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1d680 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1d690 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1d6b0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1d6c0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1d6d0 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1d6e0 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1d6f0 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1d700 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1d710 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1d720 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1d730 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1d740 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1d750 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1d760 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1d770 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1d780 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1d790 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1d7a0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1d7b0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1d7c0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1d7d0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1d7e0 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1d7f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d800 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1d810 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1d820 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1d830 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1d840 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1d850 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1d860 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1d870 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1d880 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1d890 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1d8a0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1d8b0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1d8c0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1d8d0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1d8e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1d8f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1d900 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1d910 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1d920 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1d930 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1d940 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1d950 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1d960 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1d970 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1d980 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1d990 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1d9a0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1d9b0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1d9c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1d9d0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1d9e0 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1d9f0 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1da00 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1da10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1da20 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1da30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1da40 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1da50 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1da60 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1da70 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1da80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1da90 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1daa0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1dab0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1dac0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1dad0 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  fd) );..#ifndef 
1dae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1daf0 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1db00 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1db10 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1db20 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1db30 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1db40 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1db50 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1db60 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1db70 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1db80 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1db90 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1dba0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1dbb0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1dbc0 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1dbd0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1dbe0 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1dbf0 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1dc00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1dc10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1dc20 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1dc30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1dc40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1dc50 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1dc60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1dc70 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1dc80 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1dc90 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1dca0 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1dcb0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1dcc0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1dcd0 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1dce0 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1dcf0 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1dd00 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1dd10 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1dd20 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1dd30 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1dd40 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1dd50 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1dd60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1dd70 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1dd80 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1dd90 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1dda0 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1ddb0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1ddc0 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1ddd0 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1dde0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1ddf0 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1de00 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1de10 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1de20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1de30 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1de40 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1de50 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1de60 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1de70 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1de80 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1de90 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1dea0 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1deb0 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1dec0 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c  hite noise equal
1ded0 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1dee0 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1def0 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1df00 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1df10 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1df20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1df30 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1df40 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1df50 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1df60 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1df70 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1df80 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1df90 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1dfa0 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1dfb0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1dfc0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1dfd0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1dfe0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1dff0 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1e000 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1e010 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1e020 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1e030 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52  _BKPT);..  PAGER
1e040 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1e050 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1e060 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1e070 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1e080 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1e090 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1e0a0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1e0b0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1e0c0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1e0d0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1e0e0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1e0f0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1e100 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1e110 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1e120 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1e130 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1e140 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1e150 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1e160 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1e170 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1e180 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1e190 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1e1a0 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1e1b0 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1e1c0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1e1d0 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1e1e0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1e1f0 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1e200 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1e210 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1e220 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1e230 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1e240 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1e250 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1e260 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1e270 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1e280 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1e290 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1e2a0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1e2b0 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1e2c0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1e2d0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1e2e0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1e2f0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1e300 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1e310 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1e320 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1e330 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1e340 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1e350 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1e360 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1e370 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1e380 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1e390 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1e3a0 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1e3b0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1e3c0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1e3d0 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1e3e0 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1e3f0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1e400 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1e410 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1e420 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1e430 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1e440 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1e450 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1e460 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1e470 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e480 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1e490 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1e4a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1e4b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1e4c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e4d0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1e4e0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1e4f0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1e500 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1e510 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1e520 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1e530 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1e540 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1e550 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1e560 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e570 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1e580 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1e590 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1e5a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1e5b0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1e5c0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1e5d0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1e5e0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1e5f0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1e600 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1e610 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1e620 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e630 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1e640 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1e650 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1e660 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1e670 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1e680 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1e690 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1e6a0 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1e6b0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1e6c0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1e6d0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1e6e0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1e6f0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1e700 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1e710 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1e720 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1e730 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1e740 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1e750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e760 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e770 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1e780 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1e790 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1e7a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e7b0 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1e7c0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1e7d0 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1e7e0 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1e7f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1e800 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1e810 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1e820 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1e830 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e840 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
1e850 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1e860 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1e870 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e880 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1e890 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
1e8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e8b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
1e8c0 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
1e8d0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rame);.      }. 
1e8e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e8f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e900 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1e910 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1e920 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1e930 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1e940 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1e950 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1e960 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1e970 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1e980 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1e990 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1e9a0 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1e9b0 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1e9c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1e9d0 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1e9e0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1e9f0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1ea00 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1ea10 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1ea20 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1ea30 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1ea40 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1ea50 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1ea60 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1ea70 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1ea80 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1ea90 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1eaa0 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1eab0 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1eac0 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1ead0 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1eae0 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1eaf0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1eb00 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1eb10 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1eb20 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1eb30 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1eb40 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1eb50 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1eb60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1eb70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1eb80 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1eb90 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1eba0 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1ebb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ebc0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1ebd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1ebe0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1ec10 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1ec20 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1ec30 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1ec40 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1ec50 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1ec60 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1ec70 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1ec80 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1ec90 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1eca0 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1ecb0 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1ecc0 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1ecd0 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1ece0 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1ecf0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1ed00 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1ed10 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1ed20 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1ed30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1ed40 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1ed50 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1ed60 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1ed70 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1ed80 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1ed90 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1eda0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1edb0 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1edc0 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1edd0 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1ede0 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1edf0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1ee00 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1ee10 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
1ee20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ee30 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f  T_CONCURRENT.  /
1ee40 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1ee50 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
1ee60 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 70 61 67  action, then pag
1ee70 65 20 31 20 6d 75 73 74 20 62 65 20 72 65 72 65  e 1 must be rere
1ee80 61 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20 74 68  ad from .  ** th
1ee90 65 20 64 62 20 66 69 6c 65 2c 20 65 76 65 6e 20  e db file, even 
1eea0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 64 69 72  if it is not dir
1eeb0 74 79 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ty. This is beca
1eec0 75 73 65 20 74 68 65 20 62 2d 74 72 65 65 20 6c  use the b-tree l
1eed0 61 79 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68  ayer .  ** may h
1eee0 61 76 65 20 61 6c 72 65 61 64 79 20 7a 65 72 6f  ave already zero
1eef0 65 64 20 74 68 65 20 6e 46 72 65 65 20 61 6e 64  ed the nFree and
1ef00 20 69 54 72 75 6e 6b 20 68 65 61 64 65 72 20 66   iTrunk header f
1ef10 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28  ields.  */.  if(
1ef20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ef30 26 20 28 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  & (pList==0 || p
1ef40 4c 69 73 74 2d 3e 70 67 6e 6f 21 3d 31 29 20 26  List->pgno!=1) &
1ef50 26 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65  & pPager->pAllRe
1ef60 61 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ad ){.    rc = p
1ef70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1ef80 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20  ((void*)pPager, 
1ef90 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  1);.  }.#endif..
1efa0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1efb0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1efc0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1efd0 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1efe0 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1eff0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1f000 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1f010 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1f020 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1f030 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f040 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f050 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1f060 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1f070 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1f080 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1f090 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1f0a0 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1f0b0 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1f0c0 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1f0d0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1f0e0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1f0f0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1f100 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1f110 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1f120 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1f130 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1f140 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1f150 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1f160 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1f170 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1f180 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1f190 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1f1a0 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1f1b0 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1f1c0 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1f1d0 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1f1e0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1f1f0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1f200 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1f210 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1f220 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1f230 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f250 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1f260 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1f270 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1f280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1f290 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1f2a0 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1f2b0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1f2e0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1f2f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f320 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1f330 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1f340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f350 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f360 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1f370 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1f380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1f390 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1f3a0 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1f3b0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1f3c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1f3d0 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1f3e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1f3f0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1f400 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1f410 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1f420 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1f430 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1f440 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f450 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1f460 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1f470 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1f480 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1f490 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1f4a0 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1f4b0 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1f4c0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1f4d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1f4e0 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1f4f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1f500 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1f510 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1f520 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1f530 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1f540 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1f550 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1f560 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1f570 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1f580 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1f590 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1f5a0 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1f5b0 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1f5c0 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1f5d0 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1f5e0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1f5f0 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1f600 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1f610 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1f620 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1f630 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1f640 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1f650 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1f660 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1f670 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1f680 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1f690 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1f6a0 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1f6b0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1f6c0 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1f6d0 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1f6e0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1f6f0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1f700 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1f710 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1f720 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1f730 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1f740 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1f750 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1f760 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1f770 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1f780 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1f790 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1f7a0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1f7b0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f7c0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f7d0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1f7e0 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1f7f0 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1f800 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1f810 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1f820 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1f830 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1f840 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f850 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f860 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1f870 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1f880 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1f890 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1f8a0 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1f8b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f8c0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1f8d0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1f8e0 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1f8f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f900 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1f910 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1f920 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1f930 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1f940 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1f950 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1f960 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1f970 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1f980 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1f990 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1f9a0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1f9b0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1f9c0 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1f9d0 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1f9e0 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1f9f0 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1fa00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1fa10 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1fa20 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1fa30 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1fa60 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1fa70 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1fa80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1fa90 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1faa0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1fab0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1fac0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1fad0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fae0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1faf0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1fb00 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1fb10 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1fb20 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1fb30 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1fb40 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1fb50 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1fb60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1fb70 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1fb80 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1fb90 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1fba0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1fbb0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1fbc0 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1fbd0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1fbe0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1fbf0 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1fc00 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1fc10 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1fc20 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1fc30 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1fc40 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1fc50 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1fc60 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1fc70 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1fc80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fc90 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
1fca0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1fcb0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
1fcc0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
1fcd0 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
1fce0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
1fcf0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
1fd00 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1fd10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1fd20 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1fd30 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1fd40 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1fd50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1fd60 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1fd70 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1fd80 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1fd90 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1fda0 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1fdb0 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1fdc0 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1fdd0 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1fde0 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1fdf0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1fe00 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1fe10 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1fe20 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1fe30 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1fe40 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1fe50 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1fe60 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1fe70 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1fe80 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1fe90 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1fea0 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1feb0 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1fec0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1fed0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1fee0 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1fef0 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1ff00 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1ff10 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1ff20 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1ff30 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1ff40 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1ff50 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1ff60 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1ff70 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1ff80 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1ff90 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1ffa0 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1ffb0 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1ffc0 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1ffd0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1ffe0 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1fff0 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
20000 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
20010 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
20020 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
20030 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
20040 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
20050 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
20060 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
20070 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
20080 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
20090 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
200a0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
200b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
200c0 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
200d0 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  OCK );.  nPage =
200e0 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
200f0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
20100 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75  ..  /* If the nu
20110 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
20120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20130 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
20140 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c  rom the.  ** WAL
20150 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74   sub-system, det
20160 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20  ermine the page 
20170 63 6f 75 6e 74 65 20 62 61 73 65 64 20 6f 6e 20  counte based on 
20180 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  the size of.  **
20190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
201a0 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65  le.  If the size
201b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
201c0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a   file is not an.
201d0 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c    ** integer mul
201e0 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
201f0 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70  e-size, round up
20200 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
20210 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
20220 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
20230 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20240 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20250 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
20260 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
20270 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
20280 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
20290 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
202a0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
202b0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
202c0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
202d0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
202e0 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
202f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
20310 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
20320 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
20330 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
20340 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
20350 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
20360 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
20370 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
20380 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
20390 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
203a0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
203b0 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
203c0 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
203d0 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
203e0 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
203f0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
20400 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
20410 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
20420 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
20430 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
20440 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
20450 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
20460 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
20470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20480 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
20490 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
204a0 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
204b0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
204c0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
204d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
204e0 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
204f0 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
20500 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20510 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
20520 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
20530 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
20540 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
20550 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
20560 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
20570 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
20580 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
20590 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
205a0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
205b0 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
205c0 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
205d0 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
205e0 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
205f0 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
20600 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
20610 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
20620 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
20630 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
20640 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
20650 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20660 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
20670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
20680 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
20690 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
206a0 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
206b0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
206c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
206d0 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
206e0 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
206f0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
20700 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
20710 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
20720 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
20730 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
20740 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
20750 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
20760 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
20770 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
20780 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
20790 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
207a0 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
207b0 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
207c0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
207d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
207e0 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
207f0 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
20800 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
20810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
20820 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20830 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
20840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20850 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
20860 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
20870 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
20880 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
20890 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
208a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
208b0 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
208c0 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
208d0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
208e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
208f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20900 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
20910 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
20920 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
20930 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
20940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
20950 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
20960 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20970 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
20980 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
20990 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
209a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
209b0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
209c0 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
209d0 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  OK;.      isWal 
209e0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
209f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20a00 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
20a10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
20a20 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
20a30 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
20a40 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
20a50 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
20a60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20a70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
20a80 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
20a90 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
20aa0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
20ab0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
20ac0 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
20ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20ae0 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
20af0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
20b00 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
20b10 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
20b20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
20b30 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
20b40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20b50 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
20b60 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
20b70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
20b80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
20b90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
20ba0 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
20bb0 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
20bc0 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
20bd0 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
20be0 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
20bf0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20c00 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
20c10 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
20c20 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
20c30 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
20c40 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
20c50 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
20c60 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
20c70 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
20c80 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
20c90 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
20ca0 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
20cb0 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
20cc0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
20cd0 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
20ce0 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
20cf0 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
20d00 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
20d10 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
20d20 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
20d30 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
20d40 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
20d50 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
20d60 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
20d70 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
20d80 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
20d90 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
20da0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20db0 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
20dc0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
20dd0 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
20de0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20df0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
20e00 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
20e10 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20e20 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
20e30 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
20e40 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20e50 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
20e60 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
20e70 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
20e80 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
20e90 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
20ea0 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
20eb0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
20ec0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20ed0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20ee0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20ef0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20f00 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
20f10 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
20f20 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
20f30 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
20f40 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
20f50 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
20f60 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
20f70 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
20f80 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
20f90 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
20fa0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20fb0 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
20fc0 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
20fd0 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
20fe0 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
20ff0 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
21000 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
21010 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
21020 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
21030 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
21040 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
21050 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
21060 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
21070 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
21080 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
21090 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
210a0 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
210b0 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
210c0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
210d0 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
210e0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
210f0 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
21100 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
21110 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
21120 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
21130 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
21140 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
21150 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
21160 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
21170 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
21180 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
21190 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
211a0 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
211b0 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
211c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
211d0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
211e0 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
211f0 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
21200 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
21210 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
21220 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
21230 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
21240 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
21250 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
21260 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
21270 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
21280 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
21290 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
212a0 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
212b0 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
212c0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
212d0 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
212e0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
212f0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
21300 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
21310 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
21320 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
21330 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
21340 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
21350 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
21360 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
21370 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
21380 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
21390 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
213a0 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
213b0 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
213c0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
213d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
213e0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
213f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21400 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
21410 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
21420 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
21430 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
21440 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
21450 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
21460 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
21470 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
21480 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
21490 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
214a0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
214b0 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
214c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
214d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
214e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
214f0 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
21500 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
21510 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
21520 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
21530 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
21540 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
21550 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
21560 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
21570 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
21580 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
21590 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
215a0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  ze;.  pPager->ch
215b0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
215c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
215d0 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
215e0 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
215f0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21600 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
21610 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
21620 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
21630 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
21640 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
21650 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
21660 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21670 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
21680 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
21690 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
216a0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
216b0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
216c0 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
216d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
216e0 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
216f0 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
21700 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
21710 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
21720 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
21730 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
21740 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
21750 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
21760 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
21770 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
21780 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
21790 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
217a0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
217b0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
217c0 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
217d0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
217e0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
217f0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
21800 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
21810 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
21820 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
21830 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
21840 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
21850 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
21860 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
21870 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
21880 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
21890 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
218a0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
218b0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
218c0 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
218d0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
218e0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
218f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
21900 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
21910 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21920 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
21930 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
21940 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
21950 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
21960 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
21970 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
21980 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
21990 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
219a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
219b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
219c0 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
219d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
219e0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
219f0 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
21a00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
21a10 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
21a20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
21a30 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21a40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
21a50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21a60 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
21a70 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
21a80 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
21a90 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
21aa0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
21ab0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
21ac0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
21ad0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
21ae0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
21af0 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
21b00 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
21b10 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
21b20 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
21b30 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
21b40 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
21b50 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
21b60 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
21b70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
21b80 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
21b90 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
21ba0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
21bb0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
21bc0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21bd0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
21be0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
21bf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
21c00 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
21c10 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
21c20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
21c30 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
21c40 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
21c50 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
21c60 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21c70 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
21c80 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
21c90 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
21ca0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
21cb0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
21cc0 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
21cd0 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
21ce0 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
21cf0 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
21d00 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
21d10 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
21d20 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
21d30 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
21d40 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
21d50 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
21d60 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
21d70 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
21d80 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
21d90 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
21da0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
21db0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
21dc0 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
21dd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
21de0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
21df0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
21e00 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
21e10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
21e20 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
21e30 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
21e40 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
21e50 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
21e60 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
21e70 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
21e80 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
21e90 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21ea0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21eb0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
21ec0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21ed0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
21ee0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
21ef0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
21f00 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
21f10 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
21f20 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
21f30 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
21f40 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
21f50 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
21f60 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
21f70 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
21f80 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
21f90 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
21fa0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
21fb0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
21fc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
21fd0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
21fe0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
21ff0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
22000 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
22010 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65  set = (i64)pSave
22020 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
22030 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
22040 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  ze);..    if( pa
22050 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
22060 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
22070 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
22080 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  intUndo(pPager->
22090 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74  pWal, pSavepoint
220a0 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20  ->aWalData);.   
220b0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53   }.    for(ii=pS
220c0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
220d0 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
220e0 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
220f0 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
22100 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
22110 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b  set==(i64)ii*(4+
22120 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22130 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
22140 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
22150 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
22160 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20  &offset, pDone, 
22170 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 1);.    }.   
22180 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22190 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
221a0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
221b0 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
221c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
221d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
221e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
221f0 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  szJ;.  }..  retu
22200 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22210 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
22220 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
22230 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
22240 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  t are allowed.**
22250 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
22260 6e 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c  ng to recycle cl
22270 65 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70  ean and unused p
22280 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ages..*/.void sq
22290 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
222a0 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
222b0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
222c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
222d0 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
222e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
222f0 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
22300 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
22310 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
22320 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
22330 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a  hat are allowed.
22340 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ** before attemp
22350 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61  ting to spill pa
22360 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a  ges to journal..
22370 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
22380 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  gerSetSpillsize(
22390 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
223a0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65  nt mxPage){.  re
223b0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
223c0 68 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  heSetSpillsize(p
223d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
223e0 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
223f0 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f  * Invoke SQLITE_
22400 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20  FCNTL_MMAP_SIZE 
22410 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72  based on the cur
22420 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a  rent value of sz
22430 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Mmap..*/.static 
22440 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70  void pagerFixMap
22450 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  limit(Pager *pPa
22460 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  ger){.#if SQLITE
22470 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
22480 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
22490 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64  *fd = pPager->fd
224a0 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66  ;.  if( isOpen(f
224b0 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f  d) && fd->pMetho
224c0 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20  ds->iVersion>=3 
224d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
224e0 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20  nt64 sz;.    sz 
224f0 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70  = pPager->szMmap
22500 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55  ;.    pPager->bU
22510 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29  seFetch = (sz>0)
22520 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
22530 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
22540 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
22550 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
22560 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e  E, &sz);.  }.#en
22570 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dif.}../*.** Cha
22580 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
22590 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f  size of any memo
225a0 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20  ry mapping made 
225b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
225c0 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
225d0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
225e0 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  pLimit(Pager *pP
225f0 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ager, sqlite3_in
22600 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70  t64 szMmap){.  p
22610 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
22620 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46  szMmap;.  pagerF
22630 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
22640 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
22650 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
22660 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
22670 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
22680 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22690 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
226a0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
226b0 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
226c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
226d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
226e0 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20  settings of the 
226f0 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73  pager to those s
22700 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
22710 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  pgFlags paramete
22720 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65  r..**.** The "le
22730 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20  vel" in pgFlags 
22740 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
22750 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68  OUS_MASK sets th
22760 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20  e robustness.** 
22770 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22780 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
22790 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70   OS crashes or p
227a0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
227b0 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65  .** changing the
227c0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
227d0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
227e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   the journals..*
227f0 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f 75 72  * There are four
22800 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
22810 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
22820 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
22830 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
22840 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
22850 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
22860 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
22870 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
22880 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
22890 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
228a0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
228b0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
228c0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
228e0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
228f0 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
22900 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
22910 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
22920 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
22930 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
22940 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
22950 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
22960 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
22970 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
22980 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
22990 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
229a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
229b0 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
229c0 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
229d0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
229e0 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
229f0 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
22a00 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
22a10 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
22a20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
22a30 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
22a40 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
22a50 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
22a60 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
22a70 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
22a80 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
22a90 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
22aa0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
22ab0 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
22ac0 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
22ad0 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
22ae0 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
22af0 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
22b00 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
22b10 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
22b20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22b30 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
22b40 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
22b50 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
22b60 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
22b70 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
22b80 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
22b90 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
22ba0 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
22bc0 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
22bd0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
22be0 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
22bf0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lback..**.**    
22c00 45 58 54 52 41 20 20 20 20 20 54 68 69 73 20 69  EXTRA     This i
22c10 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78 63 65  s like FULL exce
22c20 70 74 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20  pt that is also 
22c30 73 79 6e 63 73 20 74 68 65 20 64 69 72 65 63 74  syncs the direct
22c40 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ory.**          
22c50 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e      that contain
22c60 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  s the rollback j
22c70 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74 68 65  ournal after the
22c80 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20   rollback.**    
22c90 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
22ca0 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  l is unlinked..*
22cb0 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
22cc0 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b  s for a rollback
22cd0 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20  -journal mode.  
22ce0 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46  For WAL mode, OF
22cf0 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74  F continues.** t
22d00 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73  o mean that no s
22d10 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e  yncs ever occur.
22d20 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74    NORMAL means t
22d30 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73  hat the WAL is s
22d40 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  ynced.** prior t
22d50 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  o the start of c
22d60 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68  heckpoint and th
22d70 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
22d80 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a  file is synced.*
22d90 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
22da0 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b  ion of the check
22db0 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74  point if the ent
22dc0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ire content of t
22dd0 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72  he WAL.** was wr
22de0 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
22df0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
22e00 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61  ut no sync opera
22e10 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a  tions occur for.
22e20 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63  ** an ordinary c
22e30 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20  ommit in NORMAL 
22e40 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20  mode with WAL.  
22e50 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  FULL means that 
22e60 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20  the WAL.** file 
22e70 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  is synced follow
22e80 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20  ing each commit 
22e90 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64  operation, in ad
22ea0 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  dition to the.**
22eb0 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65   syncs associate
22ec0 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20  d with NORMAL.  
22ed0 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
22ee0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 46  erence between F
22ef0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41  ULL.** and EXTRA
22f00 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a   for WAL mode..*
22f10 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66  *.** Do not conf
22f20 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  use synchronous=
22f30 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45  FULL with SQLITE
22f40 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65  _SYNC_FULL.  The
22f50 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  .** SQLITE_SYNC_
22f60 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73  FULL macro means
22f70 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f   to use the MacO
22f80 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73  SX-style full-fs
22f90 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e  ync.** using fcn
22fa0 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e  tl(F_FULLFSYNC).
22fb0 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f    SQLITE_SYNC_NO
22fc0 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f  RMAL means to do
22fd0 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
22fe0 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54  fsync() call.  T
22ff0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
23000 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51  rence between SQ
23010 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a  LITE_SYNC_FULL.*
23020 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e  * and SQLITE_SYN
23030 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74  C_NORMAL on plat
23040 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e  forms other than
23050 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68   MacOSX.  But th
23060 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73  e.** synchronous
23070 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e  =FULL versus syn
23080 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20  chronous=NORMAL 
23090 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e  setting determin
230a0 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78  es when.** the x
230b0 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69  Sync primitive i
230c0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20  s called and is 
230d0 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20  relevant to all 
230e0 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a  platforms..**.**
230f0 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
23100 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23110 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
23120 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
23130 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
23140 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
23150 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
23160 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
23170 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
23180 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
23190 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
231a0 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61   pager to set sa
231b0 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a  fety level for *
231c0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
231d0 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72  lags      /* Var
231e0 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ious flags */.){
231f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65  .  unsigned leve
23200 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41  l = pgFlags & PA
23210 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
23220 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  MASK;.  if( pPag
23230 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
23240 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
23250 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  nc = 1;.    pPag
23260 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30  er->fullSync = 0
23270 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
23280 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  traSync = 0;.  }
23290 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
232a0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
232b0 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l==PAGER_SYNCHRO
232c0 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20  NOUS_OFF ?1:0;. 
232d0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
232e0 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47  ync = level>=PAG
232f0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46  ER_SYNCHRONOUS_F
23300 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50  ULL ?1:0;.    pP
23310 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
23320 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53  = level==PAGER_S
23330 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41  YNCHRONOUS_EXTRA
23340 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28   ?1:0;.  }.  if(
23350 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
23360 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
23370 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
23380 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
23390 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  ncFlags = 0;.  }
233a0 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73  else if( pgFlags
233b0 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59   & PAGER_FULLFSY
233c0 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
233d0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
233e0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
233f0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
23400 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
23410 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
23420 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67  }else if( pgFlag
23430 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46  s & PAGER_CKPT_F
23440 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20  ULLFSYNC ){.    
23450 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23460 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23470 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
23480 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
23490 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
234a0 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  FULL;.  }else{. 
234b0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
234c0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
234d0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
234e0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
234f0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23500 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
23510 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
23520 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
23530 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28  syncFlags;.  if(
23540 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
23550 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
23560 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
23570 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
23580 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66  CTIONS;.  }.  if
23590 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
235a0 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a  R_CACHESPILL ){.
235b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
235c0 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
235d0 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  FLAG_OFF;.  }els
235e0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  e{.    pPager->d
235f0 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
23600 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a  LLFLAG_OFF;.  }.
23610 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23620 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
23630 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
23640 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
23650 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
23660 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
23670 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
23680 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
23690 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
236a0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
236b0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
236c0 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
236d0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
236e0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
236f0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
23700 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
23710 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
23720 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
23730 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
23740 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
23750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
23760 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
23770 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
23780 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
23790 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
237a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
237b0 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
237c0 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
237d0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
237e0 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
237f0 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
23800 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
23810 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
23820 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
23830 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
23840 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
23850 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
23860 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
23870 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
23880 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
23890 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
238a0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
238b0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
238c0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
238d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
238e0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
238f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
23900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
23910 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
23920 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
23930 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
23940 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
23950 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
23960 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
23970 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
23980 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
23990 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
239a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
239b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
239c0 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
239d0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
239e0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
239f0 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
23a00 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
23a10 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
23a20 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
23a30 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
23a40 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
23a50 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
23a60 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
23a70 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
23a80 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
23a90 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
23aa0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
23ab0 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
23ac0 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
23ad0 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
23ae0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
23af0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
23b00 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
23b10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
23b20 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
23b30 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
23b40 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
23b50 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
23b60 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
23b70 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
23b80 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
23b90 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
23ba0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
23bb0 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
23bc0 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
23bd0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
23be0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
23bf0 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
23c00 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
23c10 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
23c20 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
23c30 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
23c40 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
23c50 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
23c60 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
23c70 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
23c80 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
23c90 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
23ca0 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
23cb0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
23cc0 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
23cd0 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
23d00 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
23d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d40 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
23d50 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
23d60 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
23d70 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
23d80 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
23d90 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
23da0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
23db0 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
23dc0 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
23dd0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
23de0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
23df0 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
23e00 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
23e10 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
23e20 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
23e30 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
23e40 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
23e50 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
23e60 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
23e70 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
23e80 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
23e90 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
23ea0 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
23eb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
23ec0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
23ed0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
23ee0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
23ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
23f00 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
23f10 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
23f20 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
23f30 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
23f40 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
23f50 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
23f60 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
23f70 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
23f80 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
23f90 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
23fa0 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  dler */.){.  pPa
23fb0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
23fc0 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
23fd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
23fe0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
23ff0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a  usyHandlerArg;..
24000 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24010 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24020 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69  void **ap = (voi
24030 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42  d **)&pPager->xB
24040 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
24050 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29  assert( ((int(*)
24060 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29  (void *))(ap[0])
24070 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20  )==xBusyHandler 
24080 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
24090 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c  p[1]==pBusyHandl
240a0 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c  erArg );.    sql
240b0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
240c0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
240d0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42  , SQLITE_FCNTL_B
240e0 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69  USYHANDLER, (voi
240f0 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  d *)ap);.  }.}..
24100 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
24110 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
24120 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
24130 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
24140 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
24150 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
24160 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
24170 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
24180 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
24190 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
241a0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
241b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
241c0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
241d0 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
241e0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
241f0 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
24200 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20  QLITE_IOERR, an 
24210 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78  SQLITE_IOERR_xxx
24220 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c   sub-code or SQL
24230 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
24240 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
24250 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
24260 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
24270 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
24280 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
24290 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
242a0 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
242b0 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
242c0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
242d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
242e0 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
242f0 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
24300 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
24310 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
24320 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
24330 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
24340 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
24350 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
24360 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
24370 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
24380 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
24390 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
243a0 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
243b0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
243c0 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
243d0 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
243e0 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
243f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24400 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
24410 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
24420 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
24430 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
24440 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
24450 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
24460 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
24470 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
24480 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
24490 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
244a0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
244b0 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
244c0 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
244d0 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
244e0 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
244f0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24500 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
24510 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
24520 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
24530 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
24540 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
24550 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
24560 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
24570 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
24580 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
24590 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
245a0 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
245b0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
245c0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
245d0 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
245e0 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
245f0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
24600 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
24610 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
24620 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
24630 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
24640 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
24650 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50  *pPager, u32 *pP
24660 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
24670 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
24680 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
24690 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
246a0 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66  ssible to do a f
246b0 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72  ull assert_pager
246c0 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61  _state() here, a
246d0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
246e0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
246f0 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50  ed from within P
24700 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f  agerOpen(), befo
24710 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  re the state.  *
24720 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  * of the Pager o
24730 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61  bject is interna
24740 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a  lly consistent..
24750 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65    **.  ** At one
24760 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63   point this func
24770 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e  tion returned an
24780 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61   error if the pa
24790 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a  ger was in .  **
247a0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
247b0 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41  te. But since PA
247c0 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20  GER_ERROR state 
247d0 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
247e0 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74    ** there is at
247f0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
24800 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
24810 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63  rence, this func
24820 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e  tion.  ** is a n
24830 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61  o-op for that ca
24840 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a  se anyhow..  */.
24850 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20  .  u32 pageSize 
24860 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
24870 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
24880 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
24890 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
248a0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
248b0 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66  GE_SIZE) );.  if
248c0 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( (pPager->memDb
248d0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
248e0 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20  bSize==0).   && 
248f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
24900 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
24910 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26  Cache)==0 .   &&
24920 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
24930 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67  eSize!=(u32)pPag
24940 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
24950 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
24960 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  w = NULL;       
24970 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d        /* New tem
24980 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  p space */.    i
24990 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20  64 nByte = 0;.. 
249a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
249b0 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
249c0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
249d0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
249e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
249f0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
24a00 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
24a10 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
24a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24a30 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29   pNew = (char *)
24a40 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
24a50 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
24a60 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72     if( !pNew ) r
24a70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
24a80 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
24a90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24aa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
24ab0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
24ac0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
24ad0 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
24ae0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
24af0 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
24b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
24b30 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
24b40 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
24b50 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
24b60 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
24b70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
24b80 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b  = (Pgno)((nByte+
24b90 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65  pageSize-1)/page
24ba0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
24bb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
24bc0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65  pageSize;.    }e
24bd0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
24be0 65 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29  e3PageFree(pNew)
24bf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
24c00 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
24c10 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
24c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24c30 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65  K ){.    if( nRe
24c40 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
24c50 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
24c60 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
24c70 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
24c80 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
24c90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
24ca0 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
24cb0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
24cc0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
24cd0 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46  ger);.    pagerF
24ce0 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
24cf0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
24d00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
24d10 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
24d20 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
24d30 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
24d40 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
24d50 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
24d60 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
24d70 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
24d80 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
24d90 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
24da0 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
24db0 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
24dc0 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
24dd0 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
24de0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
24df0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
24e00 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
24e10 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
24e20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
24e30 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
24e40 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
24e50 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
24e60 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
24e70 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
24e80 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
24e90 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
24ea0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
24eb0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
24ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
24ed0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
24ee0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
24ef0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
24f00 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
24f10 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
24f20 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
24f30 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
24f40 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
24f50 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
24f60 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
24f70 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
24f80 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
24f90 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
24fa0 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
24fb0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
24fc0 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
24fd0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
24fe0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
24ff0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
25000 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
25010 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
25020 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
25030 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
25040 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ge;.  }.  assert
25050 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25060 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20  !=PAGER_OPEN ); 
25070 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f       /* Called o
25080 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63  nly by OP_MaxPgc
25090 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  nt */.  assert( 
250a0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d  pPager->mxPgno>=
250b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
250c0 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e  ;  /* OP_MaxPgcn
250d0 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20  t enforces this 
250e0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  */.  return pPag
250f0 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
25100 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
25110 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
25120 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
25130 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
25140 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
25150 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
25160 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
25170 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
25180 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
25190 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
251a0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
251b0 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
251c0 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
251d0 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
251e0 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
251f0 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
25200 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
25210 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
25220 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
25230 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
25240 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
25250 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
25260 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
25270 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
25280 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
25290 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
252a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
252b0 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
252c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
252d0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
252e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
252f0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
25300 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
25310 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
25320 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
25330 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25340 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
25350 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
25360 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
25370 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
25380 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
25390 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
253a0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
253b0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
253c0 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
253d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
253e0 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
253f0 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
25400 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
25410 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
25420 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
25430 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
25440 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
25450 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
25460 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
25470 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
25480 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
25490 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
254a0 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
254b0 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
254c0 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
254d0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
254e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
254f0 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
25500 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
25510 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
25520 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
25530 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
25540 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
25550 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
25560 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
25570 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
25580 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
25590 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
255a0 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
255b0 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
255c0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
255d0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
255e0 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
255f0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
25600 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
25610 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
25620 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
25630 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
25640 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
25650 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
25660 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
25670 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
25680 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
25690 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
256a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
256b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
256c0 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e );..  /* This 
256d0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
256e0 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20  called by btree 
256f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
25700 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  r creating.  ** 
25710 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
25720 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74  .  There has not
25730 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75   been an opportu
25740 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69  nity to transiti
25750 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d  on.  ** to WAL m
25760 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  ode yet..  */.  
25770 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
25780 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
25790 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
257a0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
257b0 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
257c0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
257d0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
257e0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
257f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
25800 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
25810 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
25820 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
25830 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25840 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
25850 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25860 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25870 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
25880 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
25890 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
258a0 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  is open on.** th
258b0 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75  e pager. It retu
258c0 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
258d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
258e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
258f0 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  *.** However, if
25900 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
25910 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
25920 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
25930 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
25940 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
25950 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
25960 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25970 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
25980 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
25990 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73  t *pnPage){.  as
259a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
259b0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
259c0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
259d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
259e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
259f0 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61  ISHED );.  *pnPa
25a00 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72  ge = (int)pPager
25a10 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a  ->dbSize;.}.../*
25a20 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
25a30 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
25a40 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
25a50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
25a60 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
25a70 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
25a80 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
25a90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25aa0 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
25ab0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
25ac0 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
25ad0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
25ae0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
25af0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
25b00 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
25b10 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
25b20 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
25b30 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
25b40 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
25b50 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
25b60 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
25b70 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
25b80 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
25b90 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
25ba0 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
25bb0 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
25bc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
25bd0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
25be0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
25bf0 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
25c00 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
25c10 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
25c20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
25c30 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
25c40 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
25c50 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
25c60 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
25c70 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
25c80 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
25c90 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
25ca0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
25cb0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
25cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ce0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25cf0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
25d00 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
25d10 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
25d20 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
25d30 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
25d40 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20  ready held), or 
25d50 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73  one of the trans
25d60 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  itions that the 
25d70 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
25d80 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
25d90 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
25da0 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
25db0 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
25dc0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
25dd0 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
25de0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
25df0 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79  r->eLock>=lockty
25e00 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
25e10 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
25e20 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
25e30 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  e==SHARED_LOCK).
25e40 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
25e50 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  r->eLock==RESERV
25e60 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  ED_LOCK && lockt
25e70 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
25e80 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20  OCK).  );..  do 
25e90 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
25ea0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c  LockDb(pPager, l
25eb0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  ocktype);.  }whi
25ec0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
25ed0 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
25ee0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
25ef0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
25f00 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  Arg) );.  return
25f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
25f20 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
25f30 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25f40 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
25f50 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
25f60 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
25f70 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
25f80 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
25f90 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
25fa0 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
25fb0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
25fc0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
25fd0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
25fe0 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
25ff0 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
26000 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
26010 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
26020 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
26030 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
26040 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
26050 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
26060 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
26070 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
26080 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
26090 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
260a0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
260b0 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
260c0 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
260d0 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
260e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
260f0 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
26100 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
26110 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
26120 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
26130 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
26140 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
26150 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
26160 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
26170 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
26180 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
26190 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
261a0 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
261b0 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
261c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
261d0 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
261e0 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
261f0 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
26200 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
26210 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
26220 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  vior would be to
26230 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
26240 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
26250 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
26260 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
26270 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
26280 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
26290 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
262a0 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
262b0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
262c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
262d0 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
262e0 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
262f0 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
26300 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
26310 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
26320 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
26330 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
26340 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
26350 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
26360 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
26370 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
26380 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
26390 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
263a0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
263b0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
263c0 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
263d0 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
263e0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
263f0 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
26400 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
26410 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
26420 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
26430 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
26440 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
26450 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26460 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
26470 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
26480 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
26490 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
264a0 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
264b0 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
264c0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
264d0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
264e0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
264f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
26500 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
26510 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
26520 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
26530 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
26540 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
26550 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
26560 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
26570 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
26580 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
26590 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
265a0 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
265b0 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
265c0 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
265d0 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
265e0 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
265f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
26600 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
26610 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26620 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69  s only called ri
26630 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
26640 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
26650 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ion..** Once thi
26660 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  s function has b
26670 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
26680 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
26690 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f   either be.** ro
266a0 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d  lled back or com
266b0 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f  mitted. It is no
266c0 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74  t safe to call t
266d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
266e0 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  .** then continu
266f0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
26700 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
26710 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
26720 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
26730 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
26740 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
26750 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
26760 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
26770 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
26780 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
26790 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
267a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
267b0 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41  = nPage;..  /* A
267c0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20  t one point the 
267d0 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64  code here called
267e0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
267f0 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20  onstraint() to. 
26800 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
26810 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20  all pages being 
26820 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62  truncated away b
26830 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
26840 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e   are,.  ** if on
26850 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
26860 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70  ints are open, p
26870 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61  resent in the sa
26880 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f  vepoint .  ** jo
26890 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68  urnal so that th
268a0 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
268b0 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f  ed if the savepo
268c0 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20  int is rolled.  
268d0 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ** back. This is
268e0 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73   no longer neces
268f0 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e  sary as this fun
26900 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c  ction is now onl
26910 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69  y.  ** called ri
26920 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
26930 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
26940 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68  ion. So although
26950 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
26960 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c   object may stil
26970 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65  l have open save
26980 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53  points (Pager.nS
26990 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20  avepoint!=0), . 
269a0 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   ** they cannot 
269b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
269c0 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75  So the assertTru
269d0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
269e0 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e  ) call.  ** is n
269f0 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74  o longer correct
26a00 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  . */.}.../*.** T
26a10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26a20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
26a30 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
26a40 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
26a50 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
26a60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
26a70 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
26a80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26a90 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
26aa0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
26ab0 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
26ac0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
26ad0 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
26ae0 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
26af0 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
26b00 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
26b10 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
26b20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
26b30 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
26b40 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
26b50 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
26b60 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
26b70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
26b80 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
26b90 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
26ba0 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
26bb0 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
26bc0 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
26bd0 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
26be0 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
26bf0 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
26c00 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
26c10 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
26c20 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
26c30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
26c40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
26c50 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
26c60 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
26c70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
26c80 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
26c90 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26ca0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26cb0 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
26cc0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
26cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
26ce0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
26cf0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
26d00 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
26d10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26d20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26d30 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
26d40 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
26d50 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
26d60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26d70 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
26d80 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
26d90 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   memory mapped p
26da0 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70  age object for p
26db0 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e  age number pgno.
26dc0 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a   .** The new obj
26dd0 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65  ect will use the
26de0 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20   pointer pData, 
26df0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46  obtained from xF
26e00 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75  etch()..** If su
26e10 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
26e20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74  pPage to point t
26e30 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72  o the new page r
26e40 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20  eference.** and 
26e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26e60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
26e70 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
26e80 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74  ror code and set
26e90 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a  .** *ppPage to z
26ea0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ero..**.** Page 
26eb0 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69  references obtai
26ec0 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ned by calling t
26ed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
26ee0 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a  uld be released.
26ef0 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61  ** by calling pa
26f00 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26f10 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
26f20 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  nt pagerAcquireM
26f30 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20  apPage(.  Pager 
26f40 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
26f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26f60 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
26f70 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f90 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  * Page number */
26fa0 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  .  void *pData, 
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fc0 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64     /* xFetch()'d
26fd0 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70   data for this p
26fe0 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
26ff0 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20  *ppPage         
27000 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
27010 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f   Acquired page o
27020 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67  bject */.){.  Pg
27030 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27050 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   Memory mapped p
27060 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  age to return */
27070 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67 65 72  .  .  if( pPager
27080 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
27090 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
270a0 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d   p = pPager->pMm
270b0 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  apFreelist;.    
270c0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
270d0 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74  elist = p->pDirt
270e0 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
270f0 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 0;.    memset
27100 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70  (p->pExtra, 0, p
27110 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
27120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
27130 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64  Page = p = (PgHd
27140 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r *)sqlite3Mallo
27150 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48  cZero(sizeof(PgH
27160 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  dr) + pPager->nE
27170 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70  xtra);.    if( p
27180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
27190 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
271a0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
271b0 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
271c0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74  ->pageSize, pDat
271d0 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
271e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
271f0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  PT;.    }.    p-
27200 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20  >pExtra = (void 
27210 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e  *)&p[1];.    p->
27220 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d  flags = PGHDR_MM
27230 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  AP;.    p->nRef 
27240 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67  = 1;.    p->pPag
27250 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d  er = pPager;.  }
27260 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
27270 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26  Extra==(void *)&
27280 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  p[1] );.  assert
27290 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b  ( p->pPage==0 );
272a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c  .  assert( p->fl
272b0 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20  ags==PGHDR_MMAP 
272c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
272d0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
272e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
272f0 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e  Ref==1 );..  p->
27300 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
27310 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->pData = pData;
27320 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
27330 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e  Out++;..  return
27340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27350 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
27360 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
27370 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68   pPg. pPg must h
27380 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65  ave been returne
27390 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c  d by an .** earl
273a0 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ier call to page
273b0 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
273c0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
273d0 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  d pagerReleaseMa
273e0 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  pPage(PgHdr *pPg
273f0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
27400 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27410 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
27420 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70  pOut--;.  pPg->p
27430 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
27440 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
27450 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
27460 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20  eelist = pPg;.. 
27470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27480 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69  >fd->pMethods->i
27490 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20  Version>=3 );.  
274a0 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
274b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
274c0 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  4)(pPg->pgno-1)*
274d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
274e0 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d  , pPg->pData);.}
274f0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
27500 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73   PgHdr objects s
27510 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67  tored in the Pag
27520 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  er.pMmapFreelist
27530 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
27540 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d   void pagerFreeM
27550 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50  apHdrs(Pager *pP
27560 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
27570 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  p;.  PgHdr *pNex
27580 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  t;.  for(p=pPage
27590 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
275a0 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
275b0 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44     pNext = p->pD
275c0 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  irty;.    sqlite
275d0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
275e0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  .../*.** Shutdow
275f0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
27600 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
27610 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
27620 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
27630 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
27640 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
27650 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27660 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
27670 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
27680 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
27690 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
276a0 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
276b0 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
276c0 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
276d0 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
276e0 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
276f0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
27700 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
27710 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
27720 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
27730 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
27740 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
27750 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
27760 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
27770 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
27780 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
27790 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
277a0 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
277b0 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
277c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
277d0 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
277e0 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
277f0 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
27800 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
27810 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
27820 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
27830 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
27840 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27850 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
27860 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70  ger){.  u8 *pTmp
27870 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
27880 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61  >pTmpSpace;..  a
27890 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
278a0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
278b0 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73  ) );.  disable_s
278c0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
278d0 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
278e0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
278f0 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d  ();.  pagerFreeM
27900 61 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a  apHdrs(pPager);.
27910 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
27920 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Code = 0; */.  p
27930 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
27940 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
27950 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
27960 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  L.  sqlite3WalCl
27970 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
27980 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  , pPager->ckptSy
27990 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d  ncFlags, pPager-
279a0 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29  >pageSize, pTmp)
279b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
279c0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
279d0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
279e0 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
279f0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
27a00 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
27a10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
27a20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63  it is open, sync
27a30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27a40 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
27a50 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
27a60 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  ck..    ** If th
27a70 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20  is is not done, 
27a80 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64  then an unsynced
27a90 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
27aa0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  open journal .  
27ab0 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65    ** file may be
27ac0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
27ad0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
27ae0 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
27af0 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a  re occurs .    *
27b00 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  * while this is 
27b10 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
27b20 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
27b30 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
27b40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
27b50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
27b60 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
27b70 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ync the journal,
27b80 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72   shift the pager
27b90 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
27ba0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68   ERROR state. Th
27bb0 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b  is causes Unlock
27bc0 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75  AndRollback to u
27bd0 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a  nlock the.    **
27be0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
27bf0 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
27c00 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74  file without att
27c10 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
27c20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f  it.    ** back o
27c30 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54  r finalize it. T
27c40 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65  he next database
27c50 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20   user will have 
27c60 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  to do hot-journa
27c70 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  l.    ** rollbac
27c80 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69  k before accessi
27c90 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
27ca0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
27cb0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
27cc0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
27cd0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
27ce0 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48  ager, pagerSyncH
27cf0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
27d00 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
27d10 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
27d20 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
27d30 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
27d40 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
27d50 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
27d60 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
27d70 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
27d80 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
27d90 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
27da0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
27db0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
27dc0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
27dd0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
27de0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
27df0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
27e00 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
27e10 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
27e20 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
27e30 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
27e40 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
27e50 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
27e60 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
27e70 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
27e80 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
27e90 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
27ea0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
27eb0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
27ec0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27ed0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
27ee0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27ef0 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
27f00 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
27f10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27f20 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
27f30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
27f40 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
27f50 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
27f60 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
27f70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
27f80 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
27f90 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
27fa0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
27fb0 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
27fc0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
27fd0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
27fe0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
27ff0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
28000 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
28010 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
28020 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
28030 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
28040 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
28050 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
28060 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
28070 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
28080 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
28090 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
280a0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
280b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
280c0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
280d0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
280e0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
280f0 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
28100 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
28110 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
28120 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
28130 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
28140 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  oSync flag is se
28150 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
28160 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
28170 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
28180 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
28190 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
281a0 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
281b0 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69  and the .** devi
281c0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
281d0 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73  cs of the file-s
281e0 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
281f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
28200 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28210 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
28220 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
28230 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
28240 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
28250 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
28260 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
28270 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
28280 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
28290 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
282a0 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
282b0 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
282c0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
282d0 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
282e0 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
282f0 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
28300 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
28310 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
28320 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
28330 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
28340 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
28350 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
28360 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
28370 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
28380 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
28390 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
283a0 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
283b0 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
283c0 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
283d0 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
283e0 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
283f0 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
28400 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
28410 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
28420 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
28430 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
28440 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
28450 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
28460 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
28470 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
28480 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
28490 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
284a0 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
284b0 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
284c0 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
284d0 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
284e0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
284f0 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
28500 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
28510 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
28520 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
28530 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  this routine cle
28540 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ars the PGHDR_NE
28550 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20  ED_SYNC flag of 
28560 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63  every .** page c
28570 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e  urrently held in
28580 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72   memory before r
28590 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
285a0 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20  OK. If an IO.** 
285b0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
285c0 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49  ered, then the I
285d0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
285e0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
285f0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
28600 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
28610 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
28620 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20   int newHdr){.  
28630 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
28660 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
28670 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
28680 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
28690 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
286a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
286b0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
286c0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
286d0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
286e0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
286f0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
28700 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
28710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28720 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
28730 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69  (pPager, 0);.  i
28740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28750 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
28760 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
28770 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
28780 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
28790 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
287a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
287b0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
287c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
287d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
287e0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63  EMORY ){.      c
287f0 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
28800 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
28810 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
28820 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
28830 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
28840 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
28850 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
28860 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28870 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
28880 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
28890 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
288a0 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62   an obscure prob
288b0 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74  lem. If the last
288c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
288d0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74      ** that wrot
288e0 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  e to this databa
288f0 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67  se was operating
28900 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a   in persistent-j
28910 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
28920 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  * mode, then the
28930 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
28940 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
28950 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67  actually be larg
28960 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  er.        ** th
28970 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  an Pager.journal
28980 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68  Off bytes. If th
28990 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20  e next thing in 
289a0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
289b0 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70      ** file happ
289c0 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72  ens to be a jour
289d0 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74  nal-header (writ
289e0 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74  ten as part of t
289f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
28a00 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f  evious connectio
28a10 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  n's transaction)
28a20 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72  , and a crash or
28a30 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a   power-failure .
28a40 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72          ** occur
28a50 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20  s after nRec is 
28a60 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f  updated but befo
28a70 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  re this connecti
28a80 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20  on writes .     
28a90 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65     ** anything e
28aa0 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  lse to the journ
28ab0 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d  al file (or comm
28ac0 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69  its/rolls back i
28ad0 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts .        ** t
28ae0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65  ransaction), the
28af0 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63  n SQLite may bec
28b00 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65  ome confused whe
28b10 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20  n doing the .   
28b20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
28b30 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  nal rollback fol
28b40 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e  lowing recovery.
28b50 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63   It may roll bac
28b60 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  k all.        **
28b70 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
28b80 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20  ions data, then 
28b90 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69  proceed to rolli
28ba0 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c  ng back the old,
28bb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d  .        ** out-
28bc0 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61  of-date data tha
28bd0 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61  t follows it. Da
28be0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
28bf0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
28c00 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b        ** To work
28c10 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
28c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28c30 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f  e does appear to
28c40 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20   contain.       
28c50 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64   ** a valid head
28c60 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67  er following Pag
28c70 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74  er.journalOff, t
28c80 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30  hen write a 0x00
28c90 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
28ca0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
28cb0 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69   it to prevent i
28cc0 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63  t from being rec
28cd0 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20  ognized..       
28ce0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56   **.        ** V
28cf0 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72  ariable iNextHdr
28d00 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
28d10 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77   the offset at w
28d20 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20  hich this.      
28d30 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63    ** problematic
28d40 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63   header will occ
28d50 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ur, if it exists
28d60 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64  . aMagic is used
28d70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20   .        ** as 
28d80 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
28d90 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68  er to inspect th
28da0 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
28db0 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20  f bytes of.     
28dc0 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74     ** the potent
28dd0 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ial journal head
28de0 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
28df0 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74         i64 iNext
28e00 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  HdrOffset;.     
28e10 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b     u8 aMagic[8];
28e20 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61  .        u8 zHea
28e30 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
28e40 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20  nalMagic)+4];.. 
28e50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48         memcpy(zH
28e60 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
28e70 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
28e80 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
28e90 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
28ea0 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
28eb0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
28ec0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
28ed0 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64  .        iNextHd
28ee0 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61  rOffset = journa
28ef0 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
28f00 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r);.        rc =
28f10 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
28f20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
28f30 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f  ic, 8, iNextHdrO
28f40 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
28f50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28f60 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61  K && 0==memcmp(a
28f70 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
28f80 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
28f90 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
28fa0 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
28fb0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
28fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
28fd0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
28fe0 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65  zerobyte, 1, iNe
28ff0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
29000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29010 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29020 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
29030 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
29040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
29050 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
29060 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
29070 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
29080 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
29090 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
290a0 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
290b0 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
290c0 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
290d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
290e0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
290f0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
29100 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
29110 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
29120 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
29130 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
29140 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
29150 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
29160 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
29170 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
29180 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
29190 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
291a0 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
291b0 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
291c0 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
291d0 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
291e0 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
291f0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
29200 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
29210 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
29220 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
29230 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
29240 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
29250 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
29260 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
29270 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
29280 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
29290 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
292a0 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
292b0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
292c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
292d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
292e0 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
292f0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
29300 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
29310 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
29320 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
29330 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
29340 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
29350 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
29360 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
29370 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
29380 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29390 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
293a0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
293b0 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
293c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
293d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
293e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
293f0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
29400 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
29410 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
29420 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
29430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29440 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
29450 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
29460 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
29470 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
29480 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
29490 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
294a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
294b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
294c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
294d0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
294e0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
294f0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
29500 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
29510 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
29520 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29530 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
29540 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
29550 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
29560 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29570 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
29580 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
29590 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  ncFlags| .      
295a0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
295b0 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  cFlags==SQLITE_S
295c0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
295d0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
295e0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
295f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29600 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
29610 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
29620 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
29630 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
29640 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20  ournalOff;.     
29650 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30   if( newHdr && 0
29660 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29670 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
29680 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
29690 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
296a0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
296b0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
296c0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
296d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
296e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
296f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
29700 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
29710 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
29720 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
29730 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c   }.  }..  /* Unl
29740 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
29750 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c   in noSync mode,
29760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29770 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a  e was just .  **
29780 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
29790 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  nced. Either way
297a0 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  , clear the PGHD
297b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
297c0 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61   on .  ** all pa
297d0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ges..  */.  sqli
297e0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
297f0 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
29800 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67  pPCache);.  pPag
29810 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
29820 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b  ER_WRITER_DBMOD;
29830 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
29840 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
29850 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
29860 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29870 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
29880 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
29890 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
298a0 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
298b0 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20  connected.** by 
298c0 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
298d0 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66   pointer. This f
298e0 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65  unction writes e
298f0 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a  ach one of the.*
29900 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  * in-memory page
29910 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f  s in the list to
29920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29930 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  le. The argument
29940 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c   may.** be NULL,
29950 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
29960 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20   empty list. In 
29970 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66  this case this f
29980 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  unction is.** a 
29990 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
299a0 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64   pager must hold
299b0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
299c0 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74  RVED lock when t
299d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
299e0 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72  is called. Befor
299f0 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69  e writing anythi
29a00 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
29a10 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f  se file, this lo
29a20 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65  ck.** is upgrade
29a30 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  d to an EXCLUSIV
29a40 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  E lock. If the l
29a50 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
29a60 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  tained,.** SQLIT
29a70 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
29a80 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69  ed and no data i
29a90 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
29aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
29ab0 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
29ac0 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ger is a temp-fi
29ad0 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  le pager and the
29ae0 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73   actual file-sys
29af0 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e  tem file.** is n
29b00 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20  ot yet open, it 
29b10 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f  is created and o
29b20 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79  pened before any
29b30 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69   data is .** wri
29b40 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20  tten out..**.** 
29b50 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  Once the lock ha
29b60 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20  s been upgraded 
29b70 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
29b80 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  y, the file open
29b90 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73  ed,.** the pages
29ba0 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74   are written out
29bb0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29bc0 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72   file in list or
29bd0 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20  der. Writing.** 
29be0 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65  a page is skippe
29bf0 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69  d if it meets ei
29c00 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ther of the foll
29c10 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a  owing criteria:.
29c20 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
29c30 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  ge number is gre
29c40 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e  ater than Pager.
29c50 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20  dbSize, or.**   
29c60 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  * The PGHDR_DONT
29c70 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73  _WRITE flag is s
29c80 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  et on the page..
29c90 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67  **.** If writing
29ca0 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73   out a page caus
29cb0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
29cc0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61  file to grow, Pa
29cd0 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ger.dbFileSize.*
29ce0 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63  * is updated acc
29cf0 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67  ordingly. If pag
29d00 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f  e 1 is written o
29d10 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ut, then the val
29d20 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20  ue cached.** in 
29d30 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
29d40 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  [] is updated to
29d50 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76   match the new v
29d60 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
29d70 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
29d80 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
29d90 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
29da0 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
29db0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
29dc0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
29dd0 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20  * occurs, an IO 
29de0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29df0 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
29e00 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
29e10 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f  k cannot.** be o
29e20 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f  btained, SQLITE_
29e30 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
29e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29e50 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
29e60 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67  list(Pager *pPag
29e70 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74  er, PgHdr *pList
29e80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
29e90 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
29ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29eb0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
29ec0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
29ed0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
29ee0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  or rollback page
29ef0 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  rs in WRITER_DBM
29f00 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61  OD state. */.  a
29f10 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
29f20 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
29f30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29f40 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
29f50 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20  RITER_DBMOD );. 
29f60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29f70 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
29f80 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
29f90 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
29fa0 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
29fb0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
29fc0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
29fd0 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
29fe0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
29ff0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
2a000 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2a010 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
2a020 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
2a030 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
2a040 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2a050 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
2a060 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2a070 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
2a080 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a090 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
2a0a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2a0b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
2a0c0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
2a0d0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2a0e0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
2a0f0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
2a100 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
2a110 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
2a120 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
2a130 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
2a140 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
2a150 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
2a160 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2a170 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2a180 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2a190 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50  ITE_OK .   && pP
2a1a0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
2a1b0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a  <pPager->dbSize.
2a1c0 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44     && (pList->pD
2a1d0 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  irty || pList->p
2a1e0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69  gno>pPager->dbHi
2a1f0 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  ntSize).  ){.   
2a200 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
2a210 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
2a220 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
2a230 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
2a240 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
2a250 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2a260 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
2a270 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
2a280 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
2a290 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
2a2a0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
2a2b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2a2c0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
2a2d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2a2e0 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
2a2f0 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
2a300 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
2a310 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
2a320 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
2a330 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
2a340 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
2a350 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
2a360 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
2a370 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
2a380 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
2a390 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
2a3a0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
2a3b0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
2a3c0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
2a3d0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
2a3e0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
2a3f0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
2a400 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
2a410 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
2a420 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
2a430 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
2a440 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
2a450 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
2a460 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
2a470 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
2a480 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
2a490 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
2a4a0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
2a4b0 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
2a4c0 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
2a4d0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
2a4e0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
2a4f0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
2a500 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
2a510 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
2a520 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
2a530 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2a560 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
2a570 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2a580 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
2a590 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2a5a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2a5b0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
2a5c0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
2a5d0 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
2a5e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f  ;..      /* Enco
2a5f0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
2a600 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
2a610 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
2a620 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
2a630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a640 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b  EM_BKPT, pData);
2a650 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
2a660 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
2a670 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
2a680 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2a690 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
2a6a0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
2a6b0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
2a6c0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
2a6d0 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
2a6e0 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
2a6f0 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
2a700 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
2a710 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
2a720 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
2a730 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
2a740 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
2a750 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
2a760 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a770 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
2a780 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
2a790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2a7a0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
2a7b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2a7c0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
2a7d0 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
2a7e0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2a7f0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
2a800 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
2a810 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
2a820 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
2a830 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2a840 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
2a850 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2a860 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
2a870 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
2a880 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
2a890 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
2a8a0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
2a8b0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
2a8c0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
2a8d0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
2a8e0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
2a8f0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
2a900 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
2a910 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a920 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
2a930 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
2a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a950 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
2a960 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
2a970 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
2a980 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
2a990 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
2a9a0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
2a9b0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
2a9c0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
2a9d0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
2a9e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a9f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
2aa00 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
2aa10 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2aa20 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
2aa30 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
2aa40 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
2aa50 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
2aa60 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2aa70 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2aa80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
2aa90 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
2aaa0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2aab0 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
2aac0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
2aad0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
2aae0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
2aaf0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2ab00 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
2ab10 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
2ab20 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
2ab30 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
2ab40 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
2ab50 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
2ab60 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2ab70 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
2ab80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ab90 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
2aba0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2abb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2abc0 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
2abd0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2abe0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
2abf0 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54  t flags =  SQLIT
2ac00 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2ac10 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
2ac20 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20  READWRITE .     
2ac30 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
2ac40 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
2ac50 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20  PEN_EXCLUSIVE . 
2ac60 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
2ac70 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2ac80 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53  ;.    int nStmtS
2ac90 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
2aca0 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
2acb0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2acc0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2acd0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ace0 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
2acf0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
2ad00 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69  {.      nStmtSpi
2ad10 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ll = -1;.    }. 
2ad20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2ad30 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
2ad40 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67  r->pVfs, 0, pPag
2ad50 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c  er->sjfd, flags,
2ad60 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20   nStmtSpill);.  
2ad70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2ad80 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
2ad90 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
2ada0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
2adb0 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
2adc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
2add0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2ade0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2adf0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2ae00 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2ae10 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2ae20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2ae30 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2ae40 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2ae50 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2ae60 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2ae70 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2ae80 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2ae90 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2aea0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2aeb0 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2aec0 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2aed0 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2aee0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2aef0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2af00 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2af10 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2af20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2af30 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2af40 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2af50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2af60 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2af70 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2af80 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2af90 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2afa0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2afb0 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2afc0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2afd0 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2afe0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2aff0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2b000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2b010 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2b020 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2b030 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2b040 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2b050 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2b060 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2b070 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2b080 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2b090 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2b0a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2b0b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2b0c0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2b0d0 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2b0e0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2b0f0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2b100 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2b110 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2b120 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2b130 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2b140 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2b150 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2b160 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2b170 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2b180 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2b190 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2b1a0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2b1b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b1c0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2b1d0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2b1e0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2b1f0 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2b200 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2b210 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2b220 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2b230 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
2b240 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2b250 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2b260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b270 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29  EM_BKPT, pData2)
2b280 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
2b290 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
2b2a0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
2b2b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b2c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2b2d0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2b2e0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
2b2f0 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
2b300 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2b310 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b320 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2b330 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2b340 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
2b350 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
2b360 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
2b370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b380 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2b390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2b3a0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
2b3b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2b3c0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2b3d0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
2b3e0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
2b3f0 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
2b400 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
2b410 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
2b420 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2b430 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
2b440 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2b450 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2b460 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
2b470 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61  return subjourna
2b480 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  lPage(pPg);.  }e
2b490 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2b4a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
2b4b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2b4c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2b4d0 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
2b4e0 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
2b4f0 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
2b500 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
2b510 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
2b520 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
2b530 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
2b540 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
2b550 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
2b560 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
2b570 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
2b580 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
2b590 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
2b5a0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
2b5b0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2b5c0 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
2b5d0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
2b5e0 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
2b5f0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2b600 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
2b610 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
2b620 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2b630 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
2b640 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2b650 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
2b660 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
2b670 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2b680 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
2b690 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
2b6a0 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
2b6b0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2b6c0 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
2b6d0 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
2b6e0 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
2b6f0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
2b700 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
2b710 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
2b720 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2b730 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
2b740 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
2b750 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2b760 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2b770 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2b780 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
2b790 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
2b7a0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
2b7b0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2b7c0 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
2b7d0 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
2b7e0 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
2b7f0 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
2b800 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
2b810 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
2b820 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
2b830 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
2b840 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
2b850 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
2b860 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
2b870 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
2b880 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
2b890 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
2b8a0 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
2b8b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2b8c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2b8d0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2b8e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
2b8f0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2b900 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
2b910 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20  NotSpill NOSYNC 
2b920 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e  bit is set durin
2b930 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
2b940 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
2b950 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
2b960 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
2b970 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
2b980 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
2b990 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
2b9a0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2b9b0 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
2b9c0 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
2b9d0 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
2b9e0 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
2b9f0 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
2ba00 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
2ba10 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c  e doNotSpill ROL
2ba20 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69  LBACK and OFF bi
2ba30 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ts inhibits all 
2ba40 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20  cache spilling. 
2ba50 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f   ** regardless o
2ba60 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
2ba70 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2ba80 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2ba90 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20  t during.  ** a 
2baa0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75  rollback or by u
2bab0 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73  ser request, res
2bac0 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a  pectively..  **.
2bad0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
2bae0 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
2baf0 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
2bb00 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
2bb10 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
2bb20 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
2bb30 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
2bb40 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
2bb50 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20  ementation it . 
2bb60 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
2bb70 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61  e for sqlite3Pca
2bb80 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
2bb90 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
2bba0 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20  ateFlag==3.  ** 
2bbb0 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
2bbc0 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
2bbd0 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
2bbe0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
2bbf0 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
2bc00 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
2bc10 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
2bc20 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
2bc30 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
2bc40 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
2bc50 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
2bc60 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
2bc70 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
2bc80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2bc90 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2bca0 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
2bcb0 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73  TE_OK;.  testcas
2bcc0 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2bcd0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2bce0 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  G_ROLLBACK );.  
2bcf0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2bd00 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2bd10 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a  PILLFLAG_OFF );.
2bd20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2bd30 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2bd40 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
2bd50 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  C );.  if( pPage
2bd60 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20  r->doNotSpill.  
2bd70 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f   && ((pPager->do
2bd80 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c  NotSpill & (SPIL
2bd90 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53  LFLAG_ROLLBACK|S
2bda0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d  PILLFLAG_OFF))!=
2bdb0 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  0.      || (pPg-
2bdc0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
2bdd0 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20  EED_SYNC)!=0).  
2bde0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2bdf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2be00 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
2be10 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
2be20 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 23 69  al(pPager) ){.#i
2be30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2be40 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 20  T_CONCURRENT.   
2be50 20 2f 2a 20 49 66 20 74 68 65 20 74 72 61 6e 73   /* If the trans
2be60 61 63 74 69 6f 6e 20 69 73 20 61 20 22 42 45 47  action is a "BEG
2be70 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54 22 20 74  IN CONCURRENT" t
2be80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
2be90 70 61 67 65 20 0a 20 20 20 20 2a 2a 20 63 61 6e  page .    ** can
2bea0 6e 6f 74 20 62 65 20 66 6c 75 73 68 65 64 20 74  not be flushed t
2beb0 6f 20 64 69 73 6b 2e 20 52 65 74 75 72 6e 20 65  o disk. Return e
2bec0 61 72 6c 79 20 69 6e 20 74 68 69 73 20 63 61 73  arly in this cas
2bed0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
2bee0 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 29  ager->pAllRead )
2bef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bf00 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  K;.#endif..    /
2bf10 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65  * Write a single
2bf20 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20   frame for this 
2bf30 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e  page to the log.
2bf40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62   */.    rc = sub
2bf50 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71  journalPageIfReq
2bf60 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20  uired(pPg); .   
2bf70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bf80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2bf90 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
2bfa0 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20  pPager, pPg, 0, 
2bfb0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
2bfc0 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e  e{.  .    /* Syn
2bfd0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2bfe0 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
2bff0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  */.    if( pPg->
2c000 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2c010 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70  _SYNC .     || p
2c020 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2c030 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
2c040 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20  EMOD.    ){.    
2c050 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
2c060 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  al(pPager, 1);. 
2c070 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
2c080 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
2c090 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
2c0a0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2c0b0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
2c0c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c0d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2c0e0 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2c0f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2c100 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
2c110 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2c120 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67  list(pPager, pPg
2c130 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2c140 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
2c150 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
2c160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c170 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
2c180 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
2c190 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2c1a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2c1b0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
2c1c0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2c1d0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
2c1e0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
2c1f0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2c200 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  ; .}../*.** Flus
2c210 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63  h all unreferenc
2c220 65 64 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ed dirty pages t
2c230 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
2c240 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68  qlite3PagerFlush
2c250 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2c260 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
2c270 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69  er->errCode;.  i
2c280 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
2c290 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20   PgHdr *pList = 
2c2a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2c2b0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2c2c0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73  PCache);.    ass
2c2d0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
2c2e0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
2c2f0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
2c300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2c310 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67  List ){.      Pg
2c320 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
2c330 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
2c340 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65    if( pList->nRe
2c350 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
2c360 72 63 20 3d 20 70 61 67 65 72 53 74 72 65 73 73  rc = pagerStress
2c370 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20  ((void*)pPager, 
2c380 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
2c390 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e        pList = pN
2c3a0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
2c3b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c3c0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2c3d0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  nd initialize a 
2c3e0 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74  new Pager object
2c3f0 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
2c400 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a  er to it.** in *
2c410 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67  ppPager. The pag
2c420 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75  er should eventu
2c430 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79  ally be freed by
2c440 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74   passing it.** t
2c450 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  o sqlite3PagerCl
2c460 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ose()..**.** The
2c470 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
2c480 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20  ent is the path 
2c490 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2c4a0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a  file to open..**
2c4b0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2c4c0 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
2c4d0 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
2c4e0 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
2c4f0 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
2c500 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
2c510 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70   be cached. Temp
2c520 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20  orary files are 
2c530 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
2c540 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
2c550 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64   they are closed
2c560 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  . If zFilename i
2c570 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
2c580 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d  n .** all inform
2c590 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
2c5a0 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65   cache. It is ne
2c5b0 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
2c5c0 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61  isk. .** This ca
2c5d0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
2c5e0 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d  lement an in-mem
2c5f0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
2c600 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70  .** The nExtra p
2c610 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
2c620 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
2c630 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2c640 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
2c650 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67  ng with each pag
2c660 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69  e reference. Thi
2c670 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  s space is avail
2c680 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2c690 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69  .** via the sqli
2c6a0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
2c6b0 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68  () API..**.** Th
2c6c0 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
2c6d0 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63   is used to spec
2c6e0 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74  ify properties t
2c6f0 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a  hat affect the.*
2c700 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  * operation of t
2c710 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f  he pager. It sho
2c720 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f  uld be passed so
2c730 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69  me bitwise combi
2c740 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  nation.** of the
2c750 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a   PAGER_* flags..
2c760 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
2c770 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
2c780 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
2c790 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
2c7a0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
2c7b0 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
2c7c0 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
2c7d0 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
2c7e0 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
2c7f0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
2c800 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
2c810 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
2c820 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
2c830 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
2c840 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2c850 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
2c860 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
2c870 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
2c880 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
2c890 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2c8a0 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
2c8b0 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
2c8c0 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
2c8d0 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
2c8e0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2c8f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
2c900 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
2c910 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
2c920 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
2c930 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
2c940 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
2c950 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
2c960 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c970 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
2c980 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2c990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
2c9a0 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
2c9b0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
2c9c0 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
2c9d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
2c9e0 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
2c9f0 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
2ca00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ca10 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
2ca20 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2ca30 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2ca40 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2ca50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ca60 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
2ca70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
2ca80 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
2ca90 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2caa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2cab0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
2cac0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
2cad0 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
2cae0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2caf0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
2cb00 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
2cb10 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
2cb20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
2cb30 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
2cb40 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
2cb50 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
2cb60 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
2cb70 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
2cb80 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2cb90 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
2cba0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
2cbb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cbc0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
2cbd0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2cbe0 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
2cbf0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2cc00 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
2cc10 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
2cc20 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
2cc30 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
2cc40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2cc50 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
2cc60 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2cc70 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
2cc80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2cc90 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
2cca0 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
2ccb0 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
2ccc0 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
2ccd0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2cce0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
2ccf0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
2cd00 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
2cd10 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
2cd20 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2cd30 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
2cd40 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
2cd50 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2cd60 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
2cd70 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
2cd80 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
2cd90 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
2cda0 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
2cdb0 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
2cdc0 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
2cdd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2cde0 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
2cdf0 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2ce00 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
2ce10 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u32 szPageDflt =
2ce20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ce30 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
2ce40 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2ce50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2ce60 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f   *zUri = 0;    /
2ce70 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f  * URI args to co
2ce80 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69  py */.  int nUri
2ce90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2cea0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2ceb0 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20  tes of URI args 
2cec0 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f  at *zUri */..  /
2ced0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2cee0 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
2cef0 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
2cf00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2cf10 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
2cf20 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
2cf30 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
2cf40 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
2cf50 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a  ournal).  */.  j
2cf60 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2cf70 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2cf80 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2cf90 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
2cfa0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
2cfb0 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
2cfc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2cfd0 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
2cfe0 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2cff0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
2d000 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  DB.  if( flags &
2d010 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b   PAGER_MEMORY ){
2d020 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a  .    memDb = 1;.
2d030 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
2d040 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2d050 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68  ] ){.      zPath
2d060 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2d070 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e  StrDup(0, zFilen
2d080 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
2d090 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20  zPathname==0  ) 
2d0a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d0b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2d0c0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2d0d0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2d0e0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2d0f0 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2d100 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2d110 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2d120 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2d130 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2d140 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2d150 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2d160 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2d170 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2d180 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2d190 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2d1a0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2d1b0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2d1c0 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2d1d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2d1e0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2d1f0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2d200 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2d210 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2d220 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2d230 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2d240 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2d250 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2d260 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2d270 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2d280 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d290 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2d2a0 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2d2b0 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2d2c0 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2d2d0 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2d2e0 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2d2f0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2d300 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2d310 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2d320 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2d330 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2d340 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2d350 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2d360 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2d370 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2d380 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2d390 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2d3a0 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2d3b0 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2d3c0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2d3d0 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2d3e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2d3f0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2d400 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2d410 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2d420 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2d430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d440 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2d450 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2d460 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2d470 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2d480 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2d490 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2d4a0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2d4b0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2d4c0 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2d4d0 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2d4e0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2d4f0 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2d500 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2d510 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2d520 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2d530 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2d540 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2d550 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2d560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2d570 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2d580 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2d590 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2d5a0 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2d5b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d5c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2d5d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2d5e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2d600 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2d610 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d620 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2d630 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2d640 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2d650 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2d660 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2d670 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2d680 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2d690 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2d6a0 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2d6b0 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2d6c0 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2d6d0 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2d6e0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2d6f0 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2d700 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2d710 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2d720 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2d730 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2d740 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2d750 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2d760 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2d770 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2d780 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2d790 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2d7a0 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2d7b0 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2d7c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2d7d0 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2d7e0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2d7f0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2d800 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2d810 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2d820 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2d830 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2d840 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2d850 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2d860 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2d870 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2d880 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2d890 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2d8a0 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2d8b0 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2d8c0 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2d8d0 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2d8e0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2d8f0 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2d900 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2d910 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2d920 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2d930 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2d940 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2d950 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2d960 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2d970 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2d980 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2d990 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2d9a0 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2d9b0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2d9c0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2d9d0 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2d9e0 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2d9f0 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2da00 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20  e + 8 + 2       
2da10 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2da20 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2da30 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2da40 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2da50 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  4 + 2           
2da60 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2da70 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2da80 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2da90 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2daa0 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2dab0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2dac0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2dad0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2dae0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2daf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2db00 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
2db10 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
2db20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
2db30 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
2db40 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
2db50 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
2db60 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2db70 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
2db80 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
2db90 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2dba0 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
2dbb0 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
2dbc0 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
2dbd0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2dbe0 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
2dbf0 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
2dc00 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
2dc10 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2dc20 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2dc30 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
2dc40 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
2dc50 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
2dc60 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2dc70 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2dc80 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2dc90 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2dca0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2dcb0 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
2dcc0 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
2dcd0 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
2dce0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2dcf0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
2dd00 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61  .    assert( nPa
2dd10 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20  thname>0 );.    
2dd20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2dd30 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
2dd40 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
2dd50 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20   1 + nUri);.    
2dd60 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2dd70 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
2dd80 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2dd90 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20  .    if( nUri ) 
2dda0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2ddb0 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e  zFilename[nPathn
2ddc0 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55  ame+1], zUri, nU
2ddd0 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2dde0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ddf0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2de00 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2de10 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
2de20 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
2de30 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22  , "-journal\000"
2de40 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  , 8+2);.    sqli
2de50 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2de60 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2de70 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2de80 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  al);.#ifndef SQL
2de90 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2dea0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20   pPager->zWal = 
2deb0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2dec0 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d  l[nPathname+8+1]
2ded0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2dee0 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68  ger->zWal, zPath
2def0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2df00 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2df10 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68  ager->zWal[nPath
2df20 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30  name], "-wal\000
2df30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c  ", 4+1);.    sql
2df40 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2df50 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2df60 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29  e, pPager->zWal)
2df70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2df80 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2df90 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
2dfa0 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
2dfb0 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
2dfc0 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
2dfd0 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
2dfe0 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
2dff0 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2e000 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2e010 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  [0] ){.    int f
2e020 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
2e030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2e040 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
2e050 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
2e060 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e070 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2e080 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2e090 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
2e0a0 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
2e0b0 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62    assert( !memDb
2e0c0 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   );.    readOnly
2e0d0 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2e0e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2e0f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2e100 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2e110 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2e120 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2e130 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2e140 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2e150 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2e160 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2e170 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2e180 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2e190 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2e1a0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2e1b0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2e1c0 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2e1d0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2e1e0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2e1f0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2e200 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2e210 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2e220 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2e230 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2e240 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2e250 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2e260 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2e280 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
2e290 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2e2a0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2e2b0 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
2e2c0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
2e2d0 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
2e2e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
2e2f0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2e300 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2e310 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2e320 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e330 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2e340 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
2e350 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
2e360 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2e370 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2e380 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
2e390 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
2e3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2e3b0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2e3c0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2e3d0 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2e3e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e3f0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2e400 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  = (u32)pPager->s
2e410 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
2e420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e430 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2e440 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2e450 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  TE.        {.   
2e460 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
2e470 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e480 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2e490 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2e4a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2e4b0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2e4c0 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2e4d0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2e4e0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2e4f0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2e500 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
2e510 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
2e520 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
2e530 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2e540 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
2e550 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
2e560 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51       if( iDc&(SQ
2e570 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2e580 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20  C|(ii>>8)) ){.  
2e590 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2e5a0 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2e5b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e5d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
2e5e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f        pPager->no
2e5f0 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75  Lock = sqlite3_u
2e600 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65  ri_boolean(zFile
2e610 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20  name, "nolock", 
2e620 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  0);.      if( (i
2e630 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
2e640 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a  P_IMMUTABLE)!=0.
2e650 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2e660 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2e670 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61  ilename, "immuta
2e680 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20  ble", 0) ){.    
2e690 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c        vfsFlags |
2e6a0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2e6b0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  ADONLY;.        
2e6c0 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f    goto act_like_
2e6d0 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20  temp_file;.     
2e6e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
2e6f0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
2e700 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2e710 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
2e720 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
2e730 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
2e740 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
2e750 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
2e760 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
2e770 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
2e780 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
2e790 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
2e7a0 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
2e7b0 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
2e7c0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2e7d0 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
2e7e0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
2e7f0 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
2e800 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
2e810 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
2e820 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
2e830 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
2e840 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
2e850 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
2e860 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
2e870 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
2e880 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nal..    **.    
2e890 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 61  ** This branch a
2e8a0 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c  lso runs for fil
2e8b0 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d  es marked as imm
2e8c0 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a  utable..    */ .
2e8d0 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69  act_like_temp_fi
2e8e0 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  le:.    tempFile
2e8f0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2e900 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2e910 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20  _READER;     /* 
2e920 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61  Pretend we alrea
2e930 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a  dy have a lock *
2e940 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c  /.    pPager->eL
2e950 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ock = EXCLUSIVE_
2e960 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74  LOCK;    /* Pret
2e970 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45 58  end we are in EX
2e980 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a  CLUSIVE mode */.
2e990 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
2e9a0 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ck = 1;         
2e9b0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20         /* Do no 
2e9c0 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72  locking */.    r
2e9d0 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2e9e0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2e9f0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2ea00 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2ea10 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2ea20 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2ea30 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2ea40 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2ea50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2ea60 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2ea70 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2ea80 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2ea90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2eaa0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2eab0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2eac0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2ead0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2eae0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2eaf0 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2eb00 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2eb10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2eb20 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
2eb30 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
2eb40 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28  object. */.  if(
2eb50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2eb60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  {.    assert( nE
2eb70 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20  xtra<1000 );.   
2eb80 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
2eb90 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 72 63  (nExtra);.    rc
2eba0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2ebb0 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2ebc0 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2ebd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ebe0 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
2ebf0 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
2ec00 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
2ec10 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2ec20 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2ec30 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61  error occurred a
2ec40 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20  bove, free the  
2ec50 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2ec60 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2ec70 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2ec80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ec90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2eca0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2ecb0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
2ecc0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
2ecd0 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  Space);.    sqli
2ece0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
2ecf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2ed00 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2ed10 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2ed20 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2ed30 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2ed40 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2ed50 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2ed60 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2ed70 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2ed80 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2ed90 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2eda0 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2edb0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2edc0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2edd0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2ede0 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2edf0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2ee00 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ee10 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2ee20 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ee30 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2ee40 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2ee50 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
2ee60 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
2ee70 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
2ee80 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
2ee90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2eea0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
2eeb0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
2eec0 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
2eed0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2eee0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2eef0 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
2ef00 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2ef10 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
2ef20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
2ef30 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2ef40 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2ef50 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
2ef60 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2ef70 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
2ef80 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
2ef90 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
2efa0 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
2efb0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2efc0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
2efd0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2efe0 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
2eff0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
2f000 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
2f010 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
2f020 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
2f030 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2f040 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
2f050 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
2f060 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  empFile;.  if( p
2f070 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2f080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2f090 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30  ger->fullSync==0
2f0a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f0b0 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
2f0c0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2f0d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  rt( pPager->sync
2f0e0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2f0f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f100 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  walSyncFlags==0 
2f110 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2f120 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2f130 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  lags==0 );.  }el
2f140 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
2f150 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20  fullSync = 1;.  
2f160 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
2f170 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
2f180 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
2f190 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2f1a0 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
2f1b0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
2f1c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2f1d0 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52  AL | WAL_SYNC_TR
2f1e0 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20  ANSACTIONS;.    
2f1f0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2f200 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2f210 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
2f220 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2f230 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
2f240 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
2f250 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
2f260 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
2f270 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2f280 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
2f290 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
2f2a0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2f2b0 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
2f2c0 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
2f2d0 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
2f2e0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2f2f0 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
2f300 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
2f310 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2f320 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
2f330 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2f340 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2f350 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2f360 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
2f370 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
2f380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2f390 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2f3a0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
2f3b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
2f3c0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
2f3d0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2f3e0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
2f3f0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2f400 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
2f410 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
2f420 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
2f430 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
2f440 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
2f450 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d    /* pPager->szM
2f460 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  map = SQLITE_DEF
2f470 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f  AULT_MMAP_SIZE /
2f480 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79  / will be set by
2f490 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a   btree.c */..  *
2f4a0 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
2f4b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2f4c0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72  E_OK;.}.../* Ver
2f4d0 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74  ify that the dat
2f4e0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
2f4f0 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72  ot be deleted or
2f500 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f   renamed out fro
2f510 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70  m.** under the p
2f520 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ager.  Return SQ
2f530 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64  LITE_OK if the d
2f540 61 74 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c  atabase is still
2f550 20 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a   were it ought.*
2f560 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e  * to be on disk.
2f570 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
2f580 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  o (SQLITE_READON
2f590 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f  LY_DBMOVED or so
2f5a0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  me other error.*
2f5b0 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69  * code from sqli
2f5c0 74 65 33 4f 73 41 63 63 65 73 73 28 29 29 20 69  te3OsAccess()) i
2f5d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
2f5e0 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e  as gone missing.
2f5f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
2f600 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
2f610 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2f620 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64  .  int bHasMoved
2f630 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
2f640 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
2f650 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e  empFile ) return
2f660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2f670 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
2f680 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2f690 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
2f6a0 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  ( pPager->zFilen
2f6b0 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  ame && pPager->z
2f6c0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20  Filename[0] );. 
2f6d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2f6e0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
2f6f0 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
2f700 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26  NTL_HAS_MOVED, &
2f710 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66  bHasMoved);.  if
2f720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
2f730 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20  FOUND ){.    /* 
2f740 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44  If the HAS_MOVED
2f750 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73   file-control is
2f760 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20   unimplemented, 
2f770 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2f780 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  file.    ** has 
2f790 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20  not been moved. 
2f7a0 20 54 68 61 74 20 69 73 20 74 68 65 20 68 69 73   That is the his
2f7b0 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72  torical behavior
2f7c0 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f   of SQLite: prio
2f7d0 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73  r to.    ** vers
2f7e0 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65  ion 3.8.3, it ne
2f7f0 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20  ver checked */. 
2f800 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2f810 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  K;.  }else if( r
2f820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2f830 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20  bHasMoved ){.   
2f840 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
2f850 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20  DONLY_DBMOVED;. 
2f860 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2f870 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
2f880 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2f890 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
2f8a0 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
2f8b0 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
2f8c0 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
2f8d0 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
2f8e0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2f8f0 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
2f900 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
2f910 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
2f920 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
2f930 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
2f940 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
2f950 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
2f960 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
2f970 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
2f980 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
2f990 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
2f9a0 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
2f9b0 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
2f9c0 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
2f9d0 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
2f9e0 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
2f9f0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
2fa00 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
2fa10 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2fa20 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
2fa30 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
2fa40 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
2fa50 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
2fa60 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
2fa70 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
2fa80 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2fa90 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
2faa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fab0 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
2fac0 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
2fad0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
2fae0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2faf0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
2fb00 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
2fb10 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
2fb20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
2fb30 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
2fb40 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
2fb50 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
2fb60 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
2fb70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2fb80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fb90 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
2fba0 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
2fbb0 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
2fbc0 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2fbd0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2fbe0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
2fbf0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
2fc00 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
2fc10 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
2fc20 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
2fc30 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2fc40 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
2fc50 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
2fc60 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2fc70 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
2fc80 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
2fc90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2fca0 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
2fcb0 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
2fcc0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2fcd0 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
2fce0 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
2fcf0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
2fd00 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
2fd10 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
2fd20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2fd30 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
2fd40 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
2fd50 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
2fd60 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
2fd70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
2fd80 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
2fd90 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
2fda0 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
2fdb0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2fdc0 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
2fdd0 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2fde0 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
2fdf0 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
2fe00 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2fe10 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2fe20 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2fe30 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
2fe40 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
2fe50 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
2fe60 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
2fe70 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
2fe80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2fe90 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2fea0 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
2feb0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2fec0 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
2fed0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
2fee0 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
2fef0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
2ff00 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
2ff10 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
2ff20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2ff30 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  OK;           /*
2ff40 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2ff50 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31    int exists = 1
2ff60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ff70 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
2ff80 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2ff90 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72  sent */.  int jr
2ffa0 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65  nlOpen = !!isOpe
2ffb0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
2ffc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ffd0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2ffe0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2fff0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
30000 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30010 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
30020 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65  _OPEN );..  asse
30030 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20  rt( jrnlOpen==0 
30040 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65  || ( sqlite3OsDe
30050 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
30060 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ics(pPager->jfd)
30070 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f   &.    SQLITE_IO
30080 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
30090 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a  WHEN_OPEN.  ));.
300a0 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
300b0 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e  .  if( !jrnlOpen
300c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
300d0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
300e0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
300f0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
30100 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
30110 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ts);.  }.  if( r
30120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30130 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
30140 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20  t locked = 0;   
30150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30160 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
30170 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
30180 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
30190 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
301a0 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
301b0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
301c0 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
301d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
301e0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
301f0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
30200 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
30210 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
30220 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
30230 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
30240 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
30250 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
30260 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
30270 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
30280 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
30290 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
302a0 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
302b0 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
302c0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
302d0 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
302e0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
302f0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
30300 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
30310 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
30320 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
30330 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
30340 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
30350 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
30360 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
30370 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
30380 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
30390 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
303a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
303b0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
303c0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
303d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
303e0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ocked ){.      P
303f0 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
30400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30410 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
30420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
30430 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  /..      rc = pa
30440 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
30450 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
30460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30480 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
30490 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65  ase is zero page
304a0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20  s in size, that 
304b0 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
304c0 72 20 28 31 29 20 74 68 65 0a 20 20 20 20 20 20  r (1) the.      
304d0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20    ** journal is 
304e0 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61  a remnant from a
304f0 20 70 72 69 6f 72 20 64 61 74 61 62 61 73 65 20   prior database 
30500 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
30510 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20 20 20  me where.       
30520 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
30530 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68   file but not th
30540 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65  e journal was de
30550 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68  leted, or (2) th
30560 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20  e initial.      
30570 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
30580 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20   that populates 
30590 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
305a0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
305b0 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ack..        ** 
305c0 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
305d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
305e0 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
305f0 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20    However, take 
30600 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  care.        ** 
30610 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  not to delete th
30620 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
30630 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
30640 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20  open due to.    
30650 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d      ** journal_m
30660 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20  ode=PERSIST..   
30670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30680 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20  if( nPage==0 && 
30690 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
306a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
306b0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
306c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
306d0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
306e0 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
306f0 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  CK)==SQLITE_OK )
30700 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
30710 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
30720 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
30730 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
30740 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
30750 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
30760 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   ) pagerUnlockDb
30770 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
30780 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
30790 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
307a0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
307b0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
307c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
307d0 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
307e0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
307f0 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
30800 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
30810 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
30820 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
30830 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30840 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
30850 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
30860 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
30870 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
30880 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
30890 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
308a0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
308b0 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
308c0 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
308d0 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
308e0 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
308f0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
30900 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
30910 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
30920 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
30930 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
30940 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
30950 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
30960 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
30970 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
30980 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30990 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
309a0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
309b0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
309c0 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
309d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
309e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
309f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30a00 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
30a10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30a20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
30a30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
30a40 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
30a50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
30a60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
30a70 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
30a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
30ac0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
30ad0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30ae0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
30af0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
30b00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30b10 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
30b20 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
30b30 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
30b40 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
30b50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
30b60 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
30b70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
30b80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
30b90 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
30ba0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
30bb0 74 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  t has a zero hea
30bc0 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
30bd0 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
30be0 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
30bf0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
30c00 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
30c10 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
30c20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
30c30 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
30c40 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
30c50 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
30c60 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
30c70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
30c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30c90 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
30ca0 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
30cb0 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
30cc0 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
30cd0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
30ce0 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
30cf0 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
30d00 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
30d10 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
30d20 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
30d30 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
30d40 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
30d50 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
30d60 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
30d70 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
30d80 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
30d90 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
30da0 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
30db0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
30dc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30df0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
30e00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30e10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30e20 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
30e30 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
30e40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30e50 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
30e60 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
30e70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
30e80 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
30e90 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
30ea0 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
30eb0 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
30ec0 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
30ed0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
30ee0 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
30ef0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
30f00 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
30f10 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
30f20 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
30f30 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
30f40 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
30f50 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
30f60 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
30f70 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
30f80 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c  OPEN state (no l
30f90 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
30fa0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30fb0 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
30fc0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
30fd0 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
30fe0 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
30ff0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31000 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
31010 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
31020 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
31030 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
31040 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
31050 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
31060 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
31070 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
31080 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
31090 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
310a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
310b0 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
310c0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
310d0 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
310e0 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
310f0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
31100 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
31110 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
31120 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
31130 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
31140 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
31150 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
31160 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
31170 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
31180 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
31190 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
311a0 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
311b0 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
311c0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
311d0 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
311e0 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
311f0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31200 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
31210 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
31220 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
31230 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
31240 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
31250 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
31260 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
31270 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
31280 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
31290 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
312a0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
312b0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
312c0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
312d0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
312e0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
312f0 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
31300 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
31310 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
31320 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
31330 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62  or .** rolling b
31340 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
31350 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
31360 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
31370 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
31380 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
31390 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
313a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
313b0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
313c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
313d0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
313e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
313f0 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
31400 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
31410 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
31420 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
31430 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
31440 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
31450 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
31460 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
31470 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
31480 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
31490 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
314a0 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
314b0 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
314c0 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
314d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
314e0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
314f0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
31500 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ache)==0 );.  as
31510 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
31520 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
31530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
31540 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
31550 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
31560 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
31570 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66  R_READER );.  if
31580 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
31590 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
315a0 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
315b0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
315c0 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
315d0 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
315e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
315f0 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
31600 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
31610 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
31620 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
31630 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
31640 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
31650 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
31660 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  );..    rc = pag
31670 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
31680 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
31690 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
316a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
316b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
316c0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
316d0 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
316e0 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
316f0 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  CK );.      goto
31700 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a   failed;.    }..
31710 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
31720 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
31730 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
31740 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
31750 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
31760 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
31770 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
31780 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
31790 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
317a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
317b0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
317c0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
317d0 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
317e0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
317f0 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
31800 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
31810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31820 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31830 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
31840 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
31850 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
31860 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
31870 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
31880 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  DONLY_ROLLBACK;.
31890 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
318a0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
318b0 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
318c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
318d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
318e0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
318f0 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
31900 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
31910 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
31920 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
31930 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
31940 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
31950 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
31960 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
31970 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
31980 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
31990 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
319a0 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
319b0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
319c0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
319d0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
319e0 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
319f0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
31a00 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
31a10 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
31a20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
31a30 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
31a40 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
31a50 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
31a60 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
31a70 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
31a80 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
31a90 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
31aa0 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
31ab0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31ac0 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
31ad0 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
31ae0 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
31af0 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
31b00 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
31b10 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
31b20 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
31b30 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
31b40 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
31b50 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
31b60 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
31b70 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
31b80 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20  e lock is.      
31b90 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
31ba0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66   SHARED_LOCK bef
31bb0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
31bc0 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20  n returns..     
31bd0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
31be0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
31bf0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
31c00 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
31c10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31c20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
31c30 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  ed;.      }. .  
31c40 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
31c50 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
31c60 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78   and the file ex
31c70 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70  ists on disk, op
31c80 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
31c90 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
31ca0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
31cb0 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20  Write access is 
31cc0 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
31cd0 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78   .      ** in ex
31ce0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
31cf0 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
31d00 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
31d10 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20  kept open .     
31d20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79   ** and possibly
31d30 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
31d40 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
31d50 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63  . Also, write-ac
31d60 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  cess .      ** i
31d70 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72  s usually requir
31d80 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ed to finalize t
31d90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f  he journal in jo
31da0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69  urnal_mode=persi
31db0 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  st .      ** mod
31dc0 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20  e (and also for 
31dd0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75  journal_mode=tru
31de0 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79  ncate on some sy
31df0 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a  stems)..      **
31e00 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
31e10 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
31e20 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
31e30 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
31e40 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74  ome .      ** ot
31e50 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
31e60 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
31e70 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
31e80 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
31e90 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
31ea0 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
31eb0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
31ec0 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
31ed0 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
31ee0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
31ef0 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
31f00 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
31f10 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
31f20 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64  n was called and
31f30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31f40 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
31f50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31f60 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
31f70 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
31f80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
31f90 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
31fa0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
31fb0 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74        int bExist
31fc0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
31fd0 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
31fe0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  al file exists *
31ff0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
32000 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
32010 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
32020 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
32030 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
32040 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73  S_EXISTS, &bExis
32050 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ts);.        if(
32060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
32070 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
32080 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
32090 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
320a0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
320b0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
320c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
320d0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
320e0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
320f0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
32100 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32110 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
32120 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32130 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
32140 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
32150 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
32160 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
32170 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
32180 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
32190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
321a0 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
321b0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
321c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
321d0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
321e0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
321f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
32200 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
32210 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32230 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
32240 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
32250 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
32260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
32270 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
32280 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
32290 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
322a0 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
322b0 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
322c0 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
322d0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
322e0 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
322f0 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
32300 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
32310 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
32320 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
32330 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
32340 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
32350 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
32360 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
32370 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
32380 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
32390 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
323a0 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
323b0 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
323c0 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
323d0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
323e0 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
323f0 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
32400 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
32410 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
32420 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
32430 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
32440 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
32450 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
32460 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
32470 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32490 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
324a0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
324b0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   1);.          p
324c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
324d0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
324e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
324f0 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
32500 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
32510 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c          pagerUnl
32520 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
32530 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
32540 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
32550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32560 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
32570 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
32580 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
32590 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
325a0 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  to open.        
325b0 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20  ** or roll back 
325c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68  a hot-journal wh
325d0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ile holding an E
325e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
325f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
32600 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75  ger_unlock() rou
32610 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
32620 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  led before retur
32630 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20  ning to unlock. 
32640 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69         ** the fi
32650 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63  le. If the unloc
32660 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c  k attempt fails,
32670 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63   then Pager.eLoc
32680 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20  k must be.      
32690 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e    ** set to UNKN
326a0 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68  OWN_LOCK (see th
326b0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
326c0 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
326d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e  .        ** UNKN
326e0 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66  OWN_LOCK above f
326f0 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
32700 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  n). .        **.
32710 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72          ** In or
32720 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72  der to get pager
32730 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20  _unlock() to do 
32740 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e  this, set Pager.
32750 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20  eState to.      
32760 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
32770 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f   now. This is no
32780 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74  t actually count
32790 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69  ed as a transiti
327a0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  on.        ** to
327b0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20   ERROR state in 
327c0 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61  the state diagra
327d0 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  m at the top of 
327e0 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20  this file,.     
327f0 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
32800 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d  now that the sam
32810 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
32820 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65  unlock() will ve
32830 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ry.        ** sh
32840 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e  ortly transition
32850 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
32860 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74  t to the OPEN st
32870 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20  ate. Calling.   
32880 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70       ** assert_p
32890 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75  ager_state() wou
328a0 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20  ld fail now, as 
328b0 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
328c0 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
328d0 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52    ** to be in ER
328e0 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
328f0 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75  here are zero ou
32900 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a  tstanding page .
32910 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72          ** refer
32920 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ences..        *
32930 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  /.        pager_
32940 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
32950 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
32960 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
32970 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32980 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32990 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
329a0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
329b0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  er->eLock==SHARE
329c0 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  D_LOCK).        
329d0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
329e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
329f0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48  pPager->eLock>SH
32a00 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
32a10 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
32a20 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
32a30 46 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e  File && pPager->
32a40 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
32a50 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  k ){.      /* Th
32a60 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
32a70 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
32a80 69 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20  ired then check 
32a90 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
32aa0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
32ab0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
32ac0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
32ad0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
32ae0 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
32af0 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  the cache.  The 
32b00 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
32b10 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  k flag prevents 
32b20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  this from.      
32b30 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20  ** occurring on 
32b40 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61  the very first a
32b50 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c  ccess to a file,
32b60 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76   in order to sav
32b70 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e  e a.      ** sin
32b80 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  gle unnecessary 
32b90 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
32ba0 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72  call at the star
32bb0 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  t-up..      **. 
32bc0 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
32bd0 20 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74   changes are det
32be0 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
32bf0 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
32c00 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
32c10 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
32c20 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
32c30 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
32c40 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
32c50 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
32c60 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
32c70 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
32c80 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
32c90 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
32ca0 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
32cb0 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
32cc0 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
32cd0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
32ce0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
32cf0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
32d00 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
32d10 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
32d20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
32d30 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
32d40 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
32d50 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
32d60 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
32d70 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
32d80 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
32d90 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
32da0 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
32db0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
32dc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
32dd0 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
32de0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
32df0 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20  leVers)];..     
32e00 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
32e10 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
32e20 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
32e30 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64  rc ) goto failed
32e40 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  ;..      if( nPa
32e50 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ge>0 ){.        
32e60 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
32e70 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
32e80 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
32e90 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
32ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
32eb0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
32ec0 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
32ed0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
32ee0 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66   24);.        if
32ef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32f00 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
32f10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
32f20 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
32f30 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
32f40 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
32f50 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
32f60 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
32f70 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
32f80 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
32f90 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
32fa0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
32fb0 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
32fc0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
32fd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
32fe0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
32ff0 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  r);..        /* 
33000 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61  Unmap the databa
33010 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70  se file. It is p
33020 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74  ossible that ext
33030 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a  ernal processes.
33040 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68          ** may h
33050 61 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68  ave truncated th
33060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33070 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65  and then extende
33080 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20  d it back.      
33090 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67    ** to its orig
330a0 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20  inal size while 
330b0 74 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73  this process was
330c0 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c   not holding a l
330d0 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ock..        ** 
330e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
330f0 72 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50  re may exist a P
33100 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e  ager.pMap mappin
33110 67 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20  g that appears. 
33120 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
33130 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62  the right size b
33140 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  ut is not actual
33150 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20  ly valid. Avoid 
33160 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
33170 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75  possibility by u
33180 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20  nmapping the db 
33190 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
331a0 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
331b0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
331c0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
331d0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
331e0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  0, 0);.        }
331f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
33200 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
33210 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e  is a WAL file in
33220 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
33230 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61  , open this data
33240 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20  base in WAL.    
33250 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69  ** mode. Otherwi
33260 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
33270 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  g function call 
33280 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
33290 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
332a0 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
332b0 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64  t(pPager);.#ifnd
332c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
332d0 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  AL.    assert( p
332e0 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c  Pager->pWal==0 |
332f0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
33300 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
33310 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
33320 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
33330 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
33340 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
33350 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
33360 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
33370 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
33380 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33390 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
333a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
333b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
333c0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
333d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
333e0 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
333f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33400 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
33410 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
33420 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
33430 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
33440 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33450 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
33460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
33470 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
33480 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20  GER_READER;.    
33490 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
334a0 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20  haredLock = 1;. 
334b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
334c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
334d0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
334e0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
334f0 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
33500 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
33510 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
33520 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
33530 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
33540 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
33550 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
33560 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
33570 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
33580 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
33590 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
335a0 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
335b0 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
335c0 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
335d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
335e0 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
335f0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
33600 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
33610 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
33620 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d  Pager->nMmapOut=
33630 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33 50 63  =0 && (sqlite3Pc
33640 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
33650 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
33660 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e  ) ){.    pagerUn
33670 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
33680 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
33690 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
336a0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
336b0 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
336c0 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
336d0 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
336e0 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
336f0 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
33700 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
33710 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
33720 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
33730 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
33740 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
33750 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
33760 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
33770 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
33780 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
33790 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
337a0 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
337b0 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
337c0 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
337d0 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
337e0 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
337f0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
33800 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
33810 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
33820 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
33830 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
33840 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
33850 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
33860 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
33870 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
33880 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
33890 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
338a0 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
338b0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
338c0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
338d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
338e0 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
338f0 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
33900 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
33910 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
33920 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
33930 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
33940 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
33950 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
33960 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
33970 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
33980 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
33990 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
339a0 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
339b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
339c0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
339d0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
339e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
339f0 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
33a00 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
33a10 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
33a20 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
33a30 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
33a40 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
33a50 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
33a60 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
33a70 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
33a80 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
33a90 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
33aa0 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
33ab0 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
33ac0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
33ad0 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
33ae0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
33af0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
33b00 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
33b10 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
33b20 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
33b30 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
33b40 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
33b50 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  o scenarios:.**.
33b60 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61  **   a) When rea
33b70 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74  ding a free-list
33b80 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
33b90 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
33ba0 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65  d.**.**   b) Whe
33bb0 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
33bc0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
33bd0 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  ck and we need t
33be0 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61  o load.**      a
33bf0 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74   new page into t
33c00 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66  he cache to be f
33c10 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
33c20 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  ata read.**     
33c30 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f   from the savepo
33c40 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
33c50 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
33c60 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
33c70 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
33c80 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
33c90 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65  d of.** being re
33ca0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
33cb0 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
33cc0 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
33cd0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
33ce0 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
33cf0 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
33d00 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
33d10 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
33d20 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
33d30 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
33d40 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
33d50 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
33d60 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
33d70 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
33d80 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
33d90 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
33da0 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
33db0 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
33dc0 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
33dd0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
33de0 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
33df0 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
33e00 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
33e10 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
33e20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
33e30 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
33e40 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
33e50 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
33e60 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
33e70 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
33e80 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
33e90 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
33ea0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
33eb0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
33ec0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
33ed0 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
33ee0 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
33ef0 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
33f00 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
33f10 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
33f20 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
33f30 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
33f40 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
33f50 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
33f60 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
33f70 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
33f80 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
33f90 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
33fa0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
33fb0 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
33fc0 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
33fd0 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
33fe0 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
33ff0 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
34000 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
34010 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
34020 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
34030 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
34040 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
34050 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
34060 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
34070 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
34080 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nt sqlite3PagerG
34090 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  et(.  Pager *pPa
340a0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
340b0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
340c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
340d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
340e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
340f0 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
34100 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
34110 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
34120 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
34130 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
34140 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
34150 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
34160 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
34170 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
34180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
34190 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
341a0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
341b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
341c0 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
341d0 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
341e0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43  .  const int noC
341f0 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20  ontent = (flags 
34200 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  & PAGER_GET_NOCO
34210 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74  NTENT);..  /* It
34220 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74   is acceptable t
34230 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c  o use a read-onl
34240 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f  y (mmap) page fo
34250 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70  r any page excep
34260 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66  t.  ** page 1 if
34270 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69   there is no wri
34280 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
34290 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49  pen or the ACQUI
342a0 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  RE_READONLY.  **
342b0 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
342c0 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
342d0 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61  r. And so long a
342e0 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20  s the db is not 
342f0 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
34300 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y or in-memory d
34310 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
34320 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b  onst int bMmapOk
34330 20 3d 20 28 70 67 6e 6f 3e 31 20 26 26 20 55 53   = (pgno>1 && US
34340 45 46 45 54 43 48 28 70 50 61 67 65 72 29 0a 20  EFETCH(pPager). 
34350 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
34360 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
34370 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50  ER || (flags & P
34380 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
34390 59 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Y)).#ifdef SQLIT
343a0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
343b0 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
343c0 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a  ==0.#endif.  );.
343d0 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69  .  /* Optimizati
343e0 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67  on note:  Adding
343f0 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74   the "pgno<=1" t
34400 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f  erm before "pgno
34410 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61  ==0" here.  ** a
34420 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c  llows the compil
34430 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20  er optimizer to 
34440 72 65 75 73 65 20 74 68 65 20 72 65 73 75 6c 74  reuse the result
34450 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31  s of the "pgno>1
34460 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74  ".  ** test in t
34470 68 65 20 70 72 65 76 69 6f 75 73 20 73 74 61 74  he previous stat
34480 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64  ement, and avoid
34490 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30   testing pgno==0
344a0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d   in the.  ** com
344b0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 70  mon case where p
344c0 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f  gno is large. */
344d0 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26  .  if( pgno<=1 &
344e0 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  & pgno==0 ){.   
344f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
34500 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
34510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34520 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
34530 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
34540 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
34550 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
34560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 6f 43  );.  assert( noC
34570 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d  ontent==0 || bMm
34580 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61 73  apOk==0 );..  as
34590 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61  sert( pPager->ha
345a0 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d  sHeldSharedLock=
345b0 3d 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  =1 );..#ifndef S
345c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
345d0 52 52 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68  RRENT.  /* If th
345e0 69 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52  is is an CONCURR
345f0 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ENT transaction 
34600 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 69  and the page bei
34610 6e 67 20 72 65 61 64 20 77 61 73 0a 20 20 2a 2a  ng read was.  **
34620 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
34630 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
34640 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
34650 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2c 0a 20  on was opened,. 
34660 20 2a 2a 20 6d 61 72 6b 20 69 74 20 61 73 20 72   ** mark it as r
34670 65 61 64 20 69 6e 20 74 68 65 20 70 41 6c 6c 52  ead in the pAllR
34680 65 61 64 20 76 65 63 74 6f 72 2e 20 20 2a 2f 0a  ead vector.  */.
34690 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
346a0 6c 6c 52 65 61 64 20 26 26 20 70 67 6e 6f 3c 3d  llRead && pgno<=
346b0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
346c0 7a 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ze ){.    rc = s
346d0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
346e0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
346f0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
34700 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34710 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34720 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 23 65 6e  ire_err;.  }.#en
34730 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
34740 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
34750 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
34760 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d  turn an error im
34770 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a  mediately. .  **
34780 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75   Otherwise, requ
34790 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f  est the page fro
347a0 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79  m the PCache lay
347b0 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  er. */.  if( pPa
347c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
347d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
347e0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
347f0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
34800 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
34810 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
34820 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
34830 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
34840 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
34850 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
34860 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
34870 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34880 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34890 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
348a0 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
348b0 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   iFrame==0 ){.  
348c0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
348d0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  = 0;..      rc =
348e0 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28   sqlite3OsFetch(
348f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20  pPager->fd, .   
34900 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e         (i64)(pgn
34910 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
34920 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
34930 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74  >pageSize, &pDat
34940 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  a.      );..    
34950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34960 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a  _OK && pData ){.
34970 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
34980 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
34990 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20  _READER ){.     
349a0 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
349b0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
349c0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
349d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
349e0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
349f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
34a00 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
34a10 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44  pPager, pgno, pD
34a20 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ata, &pPg);.    
34a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34a40 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
34a50 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
34a60 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a  , (i64)(pgno-1)*
34a70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34a80 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
34a90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
34aa0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pPg ){.         
34ab0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
34ac0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
34ad0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
34ae0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  g;.          ret
34af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
34b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34b10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34b20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34b30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34b40 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34b50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b    }.    }..    {
34b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70  .      sqlite3_p
34b70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73  cache_page *pBas
34b80 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d  e;.      pBase =
34b90 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34ba0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
34bb0 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20  che, pgno, 3);. 
34bc0 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d       if( pBase==
34bd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
34be0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
34bf0 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65  etchStress(pPage
34c00 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
34c10 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20  , &pBase);.     
34c20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34c30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
34c40 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34c50 20 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65         if( pBase
34c60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
34c70 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d   pPg = *ppPage =
34c80 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
34c90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
34ca0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
34cb0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34cc0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20  re_err;.        
34cd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
34ce0 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
34cf0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34d00 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
34d10 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34d20 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61 73  pBase);.      as
34d30 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a  sert( pPg!=0 );.
34d40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
34d50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34d60 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
34d70 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
34d80 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
34d90 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
34da0 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
34db0 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
34dc0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
34dd0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
34de0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
34df0 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
34e00 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
34e10 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
34e20 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
34e30 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
34e40 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34e50 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
34e60 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70  ssert( pPg==(*pp
34e70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
34e80 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67  t( pPg->pgno==pg
34e90 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
34ea0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
34eb0 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67  ger || pPg->pPag
34ec0 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  er==0 );..  if( 
34ed0 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21  pPg->pPager && !
34ee0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
34ef0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
34f00 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65   the pcache alre
34f10 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ady contains an 
34f20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79  initialized copy
34f30 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   of.    ** the p
34f40 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68  age. Return with
34f50 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e  out further ado.
34f60 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
34f70 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58   pgno<=PAGER_MAX
34f80 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50  _PGNO && pgno!=P
34f90 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
34fa0 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67  ger) );.    pPag
34fb0 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
34fc0 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20  STAT_HIT]++;.   
34fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34fe0 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K;..  }else{.   
34ff0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
35000 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
35010 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
35020 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
35030 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
35040 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20  ialized.  */..  
35050 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
35060 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
35070 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
35080 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
35090 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
350a0 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
350b0 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
350c0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
350d0 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
350e0 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
350f0 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
35100 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
35110 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
35120 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
35130 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
35140 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
35150 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
35160 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
35170 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
35180 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ..    if( MEMDB 
35190 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
351a0 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
351b0 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
351c0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
351d0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
351e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
351f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35200 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
35210 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
35220 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
35230 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
35240 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
35250 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
35260 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
35270 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
35280 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
35290 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
352a0 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
352b0 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
352c0 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
352d0 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
352e0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
352f0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
35300 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
35310 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
35320 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
35330 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
35340 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
35350 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
35360 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
35370 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
35380 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
35390 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
353a0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
353b0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
353c0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
353d0 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
353e0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
353f0 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
35400 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
35410 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
35420 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
35430 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
35440 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
35450 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
35460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35470 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
35480 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
35490 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
354a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
354b0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
354c0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
354d0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
354e0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
354f0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
35500 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
35510 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
35520 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
35530 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
35540 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
35550 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
35560 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73       if( pagerUs
35570 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
35580 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20  bMmapOk==0 ){.  
35590 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
355a0 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
355b0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
355c0 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
355d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
355e0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
355f0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
35610 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
35620 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
35630 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
35640 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  t[PAGER_STAT_MIS
35650 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  S]++;.      rc =
35660 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
35670 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
35680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35690 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
356a0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
356b0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
356c0 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
356d0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
356e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
356f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
35700 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
35710 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
35720 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
35730 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
35740 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
35750 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
35760 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
35770 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
35780 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
35790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
357a0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
357b0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
357c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
357d0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
357e0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
357f0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
35800 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
35810 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
35820 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
35830 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
35840 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
35850 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
35860 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
35870 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
35880 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
35890 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
358a0 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
358b0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
358c0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
358d0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
358e0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
358f0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
35900 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
35910 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
35920 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
35930 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
35940 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
35950 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
35960 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
35970 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
35980 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
35990 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71  Pgno pgno){.  sq
359a0 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
359b0 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
359c0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
359d0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
359e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
359f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21  pPager->pPCache!
35a00 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
35a10 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
35a20 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
35a30 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  he, pgno, 0);.  
35a40 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30  assert( pPage==0
35a50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48   || pPager->hasH
35a60 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b  eldSharedLock );
35a70 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
35a80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
35a90 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
35aa0 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50  heFetchFinish(pP
35ab0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
35ac0 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a  gno, pPage);.}..
35ad0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
35ae0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
35af0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
35b00 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
35b10 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
35b20 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
35b30 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
35b40 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
35b50 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
35b60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
35b70 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
35b80 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
35b90 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
35ba0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
35bb0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
35bc0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
35bd0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35be0 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
35bf0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
35c00 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
35c10 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPg!=0 );.  pP
35c20 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
35c30 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66  er;.  if( pPg->f
35c40 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41  lags & PGHDR_MMA
35c50 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65  P ){.    pagerRe
35c60 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
35c70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
35c80 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
35c90 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
35ca0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
35cb0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
35cc0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
35cd0 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
35ce0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
35cf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35d00 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
35d10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
35d20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
35d30 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
35d40 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
35d50 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
35d60 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
35d70 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
35d80 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
35d90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35da0 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
35db0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
35dc0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
35dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35de0 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
35df0 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
35e00 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
35e10 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
35e20 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
35e30 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
35e40 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
35e50 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
35e60 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
35e70 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
35e80 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
35e90 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
35ea0 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
35eb0 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
35ec0 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
35ed0 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
35ee0 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
35ef0 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
35f00 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
35f10 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
35f20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
35f30 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
35f40 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
35f50 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
35f60 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
35f70 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
35f80 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
35f90 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
35fa0 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
35fb0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
35fc0 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
35fd0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
35fe0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
35ff0 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
36000 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
36010 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
36020 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
36030 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
36040 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
36050 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
36060 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
36070 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
36080 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
36090 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
360a0 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
360b0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
360c0 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
360d0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
360e0 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
360f0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
36100 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
36110 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
36120 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
36130 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
36140 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36150 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
36160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36170 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
36180 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
36190 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
361a0 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
361b0 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
361c0 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
361d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
361e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
361f0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
36200 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
36210 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
36220 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36230 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36240 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
36250 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
36260 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
36270 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36280 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
36290 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
362a0 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
362b0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
362c0 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
362d0 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
362e0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
362f0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
36300 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
36310 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
36320 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
36330 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
36340 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
36350 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
36360 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
36370 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
36380 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
36390 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
363a0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
363b0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
363c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
363d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
363e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
363f0 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  T;.    }.  .    
36400 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
36410 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
36420 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
36430 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
36440 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
36450 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
36460 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36470 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
36480 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
36490 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
364a0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
364b0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
364c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
364d0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
364e0 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
364f0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
36500 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
36510 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
36520 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
36530 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
36540 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
36550 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
36560 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
36570 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
36580 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
36590 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
365a0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a  N_TEMP_JOURNAL):
365b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
365c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
365d0 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
365e0 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    );..        /*
365f0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
36600 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20   database still 
36610 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
36620 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e  e as it did when
36630 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77  .        ** it w
36640 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  as originally op
36650 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ened. */.       
36660 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73   rc = databaseIs
36670 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b  Unmoved(pPager);
36680 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
36690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
366a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
366b0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
366c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
366d0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
366e0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
366f0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
36700 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
36710 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
36720 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
36730 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  er).          );
36740 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
36750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
36760 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
36770 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
36780 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
36790 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
367a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
367b0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
367c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
367d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
367e0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
367f0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
36800 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
36810 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
36820 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
36830 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
36840 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
36850 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
36860 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
36880 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
36890 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
368a0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
368b0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
368c0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
368d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
368e0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
368f0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
36900 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
36910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
36920 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
36930 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
36940 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
36950 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
36960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36970 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
36980 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
36990 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
369a0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
369b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
369c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
369d0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
369e0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
369f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
36a00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
36a10 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
36a20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
36a30 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
36a40 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
36a50 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
36a60 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
36a70 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
36a80 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
36a90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
36aa0 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
36ab0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
36ac0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
36ad0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
36ae0 30 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  0, then acquire 
36af0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
36b00 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
36b10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36b20 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 3e  . If exFlag is >
36b30 30 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  0, then acquire 
36b40 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
36b50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
36b60 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
36b70 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
36b80 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
36b90 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
36ba0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
36bb0 20 28 65 78 46 6c 61 67 3c 30 29 20 61 6e 64 20   (exFlag<0) and 
36bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
36bd0 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 64 6f 20  in WAL mode, do 
36be0 6e 6f 74 20 74 61 6b 65 20 61 6e 79 20 6c 6f 63  not take any loc
36bf0 6b 73 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73  ks..** The trans
36c00 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 75 6e 20  action will run 
36c10 69 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 6d 6f  in CONCURRENT mo
36c20 64 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  de instead..**.*
36c30 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
36c40 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
36c50 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
36c60 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
36c70 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
36c80 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
36c90 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
36ca0 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
36cb0 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
36cc0 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
36cd0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
36ce0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
36cf0 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
36d00 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
36d10 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
36d20 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
36d30 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
36d40 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
36d50 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
36d60 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
36d70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
36d80 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
36d90 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
36da0 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
36db0 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
36dc0 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
36dd0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
36de0 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
36df0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
36e00 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
36e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
36e20 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
36e30 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
36e40 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
36e50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36e60 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
36e70 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
36e80 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
36e90 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  rrCode;.  assert
36ea0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36eb0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
36ec0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
36ed0 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  <PAGER_ERROR );.
36ee0 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
36ef0 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
36f00 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
36f10 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  ( ALWAYS(pPager-
36f20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36f30 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73  EADER) ){.    as
36f40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
36f50 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
36f60 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
36f70 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
36f80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
36f90 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ger is configure
36fa0 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67  d to use locking
36fb0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c  _mode=exclusive,
36fc0 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a   and an.      **
36fd0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
36fe0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36ff0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  is not already h
37000 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e  eld, obtain it n
37010 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ow..      */.   
37020 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
37030 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
37040 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
37050 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
37060 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  pWal, -1) ){.   
37070 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
37080 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
37090 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
370a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
370b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
370c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
370d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
370e0 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
370f0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
37100 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
37110 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
37120 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
37130 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
37140 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
37150 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
37160 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
37170 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
37180 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
37190 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
371a0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
371b0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
371c0 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
371d0 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
371e0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
371f0 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
37200 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
37210 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
37220 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
37230 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
37240 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  t.  */.      if(
37250 20 65 78 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20   exFlag>=0 ){.  
37260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37270 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
37280 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
37290 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20 20  r->pWal);.      
372a0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
372b0 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
372c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
372d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
372e0 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
372f0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
37300 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
37310 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
37320 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
37330 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
37340 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
37350 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
37360 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
37370 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
37380 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
37390 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
373a0 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
373b0 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
373c0 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
373d0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
373e0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
373f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
37400 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
37410 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c  QLITE_OK && exFl
37420 61 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ag>0 ){.        
37430 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
37440 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
37450 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
37460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
37470 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
37490 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54  * Change to WRIT
374a0 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e  ER_LOCKED state.
374b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
374c0 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73  ** WAL mode sets
374d0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
374e0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
374f0 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44  CKED or CACHEMOD
37500 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69  .      ** when i
37510 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72  t has an open tr
37520 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e  ansaction, but n
37530 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72  ever to DBMOD or
37540 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20   FINISHED..     
37550 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
37560 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61  use in those sta
37570 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
37580 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f  roll back savepo
37590 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
375a0 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63  ansactions may c
375b0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
375c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e  e sub-journal in
375d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
375e0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
375f0 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74  s well as into t
37600 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57  he page cache. W
37610 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e  hich would be in
37620 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20  correct in .    
37630 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20    ** WAL mode.. 
37640 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
37650 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
37660 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37670 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ED;.      pPager
37680 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
37690 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
376a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
376b0 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ileSize = pPager
376c0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
376d0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
376e0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
376f0 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
37700 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
37710 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  0;.    }..    as
37720 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
37730 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
37740 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
37750 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  DER );.    asser
37760 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
37770 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37780 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37790 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61  _LOCKED );.    a
377a0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
377b0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
377c0 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  ) );.  }..  PAGE
377d0 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
377e0 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
377f0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
37800 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37810 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65 20  *.** Write page 
37820 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  pPg onto the end
37830 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
37840 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
37850 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
37860 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64 64  INE int pagerAdd
37870 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f  PageToRollbackJo
37880 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67  urnal(PgHdr *pPg
37890 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
378a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
378b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
378c0 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72 20  2 cksum;.  char 
378d0 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20 69  *pData2;.  i64 i
378e0 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
378f0 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
37900 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
37910 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
37920 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
37930 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e  ge that.  ** con
37940 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
37950 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
37960 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
37970 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  verifies.  ** th
37980 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
37990 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
379a0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
379b0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
379c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
379d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50  ->journalHdr<=pP
379e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
379f0 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50 61   );.  CODEC2(pPa
37a00 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
37a10 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
37a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
37a30 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29  EM_BKPT, pData2)
37a40 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65  ;.  cksum = page
37a50 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
37a60 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20  (u8*)pData2);.. 
37a70 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
37a80 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
37a90 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
37aa0 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
37ab0 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
37ac0 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
37ad0 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
37ae0 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
37af0 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  ge..  ** Otherwi
37b00 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
37b10 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
37b20 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
37b30 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79 62  ic in.  ** playb
37b40 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
37b50 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
37b60 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
37b70 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 2a   be restored.  *
37b80 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
37b90 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61  e file. And if a
37ba0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
37bb0 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
37bc0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72  ,.  ** then corr
37bd0 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f  uption may follo
37be0 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  w..  */.  pPg->f
37bf0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
37c00 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20 3d  ED_SYNC;..  rc =
37c10 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
37c20 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20  ger->jfd, iOff, 
37c30 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66  pPg->pgno);.  if
37c40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37c50 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
37c60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
37c70 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
37c80 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
37c90 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34  pageSize, iOff+4
37ca0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
37cb0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
37cc0 72 63 3b 0a 20 20 72 63 20 3d 20 77 72 69 74 65  rc;.  rc = write
37cd0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
37ce0 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d  fd, iOff+pPager-
37cf0 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73  >pageSize+4, cks
37d00 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
37d10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
37d20 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43 45  n rc;..  IOTRACE
37d30 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
37d40 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
37d50 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
37d60 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
37d70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
37d80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
37d90 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
37da0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
37db0 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  ej_count);.  PAG
37dc0 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
37dd0 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
37de0 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
37df0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 50  8x)\n",.       P
37e00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
37e10 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
37e20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
37e30 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
37e40 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
37e50 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
37e60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37e70 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65  Off += 8 + pPage
37e80 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 70  r->pageSize;.  p
37e90 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
37ea0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37eb0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
37ec0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
37ed0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
37ee0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
37ef0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74  g->pgno);.  test
37f00 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
37f10 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73 65  _NOMEM );.  asse
37f20 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
37f30 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
37f40 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c 3d  NOMEM );.  rc |=
37f50 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
37f60 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
37f70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73 73  Pg->pgno);.  ass
37f80 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
37f90 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
37fa0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75  _NOMEM );.  retu
37fb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37fc0 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61  Mark a single da
37fd0 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
37fe0 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  able. The page i
37ff0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
38000 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  he .** main jour
38010 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
38020 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  al as required. 
38030 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  If the page is w
38040 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f  ritten into.** o
38050 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
38060 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ls, the correspo
38070 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
38080 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65   in the .** Page
38090 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
380a0 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65  vec and the Page
380b0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
380c0 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a  vepoint bitvecs.
380d0 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73  ** of any open s
380e0 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70  avepoints as app
380f0 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
38100 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
38110 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
38120 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
38130 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
38140 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
38150 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  E_OK;..  /* This
38160 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
38170 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20  called unless a 
38180 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
38190 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20  n has already . 
381a0 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64   ** been started
381b0 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
381c0 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  le may or may no
381d0 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69  t be open at thi
381e0 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74  s point..  ** It
381f0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
38200 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
38210 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ate..  */.  asse
38220 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
38230 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
38240 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
38250 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
38260 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
38270 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
38280 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
38290 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
382a0 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
382b0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
382c0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
382d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
382e0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29  er->errCode==0 )
382f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
38300 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  er->readOnly==0 
38310 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  );.  CHECK_PAGE(
38320 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  pPg);..  /* The 
38330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
38340 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e  ds to be opened.
38350 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
38360 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65  utines have alre
38370 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65  ady.  ** obtaine
38380 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
38390 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74  locks to begin t
383a0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
383b0 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20  tion, but the.  
383c0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
383d0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
383e0 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20  t be open. Open 
383f0 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69  it now if this i
38400 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a  s the case..  **
38410 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f  .  ** This is do
38420 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ne before callin
38430 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
38440 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68  akeDirty() on th
38450 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74  e page. .  ** Ot
38460 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77  herwise, if it w
38470 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63  ere done after c
38480 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63  alling sqlite3Pc
38490 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c  acheMakeDirty(),
384a0 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72   then.  ** an er
384b0 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20  ror might occur 
384c0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f  and the pager wo
384d0 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52  uld end up in WR
384e0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
384f0 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65  e.  ** with page
38500 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
38510 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  y in the cache..
38520 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
38530 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
38540 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
38550 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
38560 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
38570 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
38580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
38590 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
385a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
385b0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
385c0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
385d0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
385e0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
385f0 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ager) );..  /* M
38600 61 72 6b 20 74 68 65 20 70 61 67 65 20 74 68 61  ark the page tha
38610 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
38620 20 6d 6f 64 69 66 69 65 64 20 61 73 20 64 69 72   modified as dir
38630 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ty. */.  sqlite3
38640 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
38650 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pPg);..  /* If a
38660 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
38670 6c 20 69 73 20 69 6e 20 75 73 65 2c 20 74 68 65  l is in use, the
38680 6d 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  m make s