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

Artifact da0832b763a947f0f30d1ac449a6a6eccce5f819929b2256a3a289f1281b1ac8:


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 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ges */.  int (*x
8460: 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f  Get)(Pager*,Pgno
8470: 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20  ,DbPage**,int); 
8480: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 66 65  /* Routine to fe
8490: 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f 0a 23  tch a patch */.#
84a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
84b0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
84c0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
84d0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
84e0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
84f0: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
8500: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8510: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
8520: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
8530: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
8540: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
8550: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
8560: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
8570: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
8580: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
8590: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
85a0: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
85b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
85c0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
85d0: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
85e0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
85f0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
8600: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
8610: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
8620: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
8630: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
8640: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
8650: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
8660: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
8670: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8680: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
8690: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
86b0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
86c0: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
86d0: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
86e0: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8700: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
8710: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
8720: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
8730: 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
8740: 0a 20 20 53 65 72 76 65 72 20 2a 70 53 65 72 76  .  Server *pServ
8750: 65 72 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f  er;.#endif.};../
8760: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
8770: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
8780: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
8790: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
87a0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
87b0: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
87c0: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
87d0: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
87e0: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
87f0: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8800: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8810: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8820: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8830: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8840: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8850: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8860: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8870: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
8880: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
8890: 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e  iables hold coun
88a0: 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  ters used for.**
88b0: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
88c0: 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76  s only.  These v
88d0: 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  ariables do not 
88e0: 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f  exist in.** a no
88f0: 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e  n-testing build.
8900: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
8910: 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64  s are not thread
8920: 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  -safe..*/.#ifdef
8930: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
8940: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
8950: 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  eaddb_count = 0;
8960: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8970: 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64   full pages read
8980: 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20   from DB */.int 
8990: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
89a0: 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  itedb_count = 0;
89b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
89c0: 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74  full pages writt
89d0: 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20  en to DB */.int 
89e0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
89f0: 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  itej_count = 0; 
8a00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8a10: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8a20: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65   journal */.# de
8a30: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8a40: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
8a50: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8a60: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
8a70: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
8a80: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
8a90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
8aa0: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
8ab0: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
8ac0: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
8ad0: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
8ae0: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
8af0: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
8b00: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
8b10: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
8b20: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
8b30: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
8b40: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
8b50: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
8b60: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
8b70: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
8b80: 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72  l is being.** wr
8b90: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
8ba0: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
8bb0: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
8bc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
8bd0: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
8be0: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
8bf0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
8c00: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
8c10: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
8c20: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
8c30: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
8c40: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
8c50: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
8c60: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
8c70: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
8c80: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
8c90: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
8ca0: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
8cb0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
8cc0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8cd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
8ce0: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
8cf0: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
8d00: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
8d10: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
8d20: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
8d30: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
8d40: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
8d50: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
8d60: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
8d70: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
8d80: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
8d90: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
8da0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
8db0: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
8dc0: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
8dd0: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
8de0: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
8df0: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
8e00: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
8e10: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
8e20: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
8e30: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
8e40: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
8e50: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
8e60: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
8e70: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
8e80: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
8e90: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
8ea0: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
8eb0: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
8ec0: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
8ed0: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
8ee0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
8ef0: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
8f00: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
8f10: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
8f20: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
8f30: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
8f40: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
8f50: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
8f60: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
8f70: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
8f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8f90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
8fa0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
8fb0: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
8fc0: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
8fd0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
8fe0: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
8ff0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
9000: 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f  f each page reco
9010: 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  rd in the journa
9020: 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  l is given by.**
9030: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
9040: 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  acro..*/.#define
9050: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
9060: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
9070: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
9080: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
9090: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
90a0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
90b0: 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
90c0: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a  the same .** siz
90d0: 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69  e as a single di
90e0: 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61  sk sector. See a
90f0: 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a  lso setSectorSiz
9100: 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  e()..*/.#define 
9110: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9120: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
9130: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
9140: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
9150: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
9160: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
9170: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
9180: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
9190: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
91a0: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
91b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
91c0: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
91d0: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
91e0: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
91f0: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
9200: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
9210: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
9220: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
9230: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
9240: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
9250: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9260: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
9270: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
9280: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
9290: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
92a0: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53 45  ** The macro USE
92b0: 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69 66  FETCH is true if
92c0: 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20   we are allowed 
92d0: 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74 63  to use the xFetc
92e0: 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a  h and xUnfetch.*
92f0: 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  * interfaces to 
9300: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
9310: 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79  ase using memory
9320: 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a  -mapped I/O..*/.
9330: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
9340: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66  MAP_SIZE>0.# def
9350: 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29 20  ine USEFETCH(x) 
9360: 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68 29  ((x)->bUseFetch)
9370: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
9380: 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23 65  USEFETCH(x) 0.#e
9390: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
93a0: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
93b0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
93c0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
93d0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
93e0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
93f0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
9400: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
9410: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
9420: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
9430: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
9440: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
9450: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
9460: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
9470: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
9480: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
9490: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
94a0: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
94b0: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
94c0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
94d0: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
94e0: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
94f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
9500: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
9510: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
9520: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
9530: 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a 2f  >pMethods!=0)../
9540: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
9550: 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75   if this pager u
9560: 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61  ses a write-ahea
9570: 64 20 6c 6f 67 20 74 6f 20 72 65 61 64 20 70 61  d log to read pa
9580: 67 65 20 70 67 6e 6f 2e 0a 2a 2a 20 52 65 74 75  ge pgno..** Retu
9590: 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  rn false if the 
95a0: 70 61 67 65 72 20 72 65 61 64 73 20 70 67 6e 6f  pager reads pgno
95b0: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
95c0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
95d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
95e0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 26 26  ITE_OMIT_WAL) &&
95f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9600: 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
9610: 52 45 41 44 29 0a 69 6e 74 20 73 71 6c 69 74 65  READ).int sqlite
9620: 33 50 61 67 65 72 55 73 65 57 61 6c 28 50 61 67  3PagerUseWal(Pag
9630: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
9640: 20 70 67 6e 6f 29 7b 0a 20 20 75 33 32 20 69 52   pgno){.  u32 iR
9650: 65 61 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ead = 0;.  int r
9660: 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
9670: 3e 70 57 61 6c 3d 3d 30 20 29 20 72 65 74 75 72  >pWal==0 ) retur
9680: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n 0;.  rc = sqli
9690: 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
96a0: 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
96b0: 6e 6f 2c 20 26 69 52 65 61 64 29 3b 0a 20 20 72  no, &iRead);.  r
96c0: 65 74 75 72 6e 20 72 63 20 7c 7c 20 69 52 65 61  eturn rc || iRea
96d0: 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  d;.}.#endif.#ifn
96e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
96f0: 57 41 4c 0a 23 20 64 65 66 69 6e 65 20 70 61 67  WAL.# define pag
9700: 65 72 55 73 65 57 61 6c 28 78 29 20 28 28 78 29  erUseWal(x) ((x)
9710: 2d 3e 70 57 61 6c 21 3d 30 29 0a 23 65 6c 73 65  ->pWal!=0).#else
9720: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
9730: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
9740: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9750: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9760: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9770: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9780: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9790: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
97a0: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
97b0: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
97c0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
97d0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
97e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
97f0: 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 23 20  ERVER_EDITION.# 
9800: 64 65 66 69 6e 65 20 70 61 67 65 72 49 73 53 65  define pagerIsSe
9810: 72 76 65 72 28 78 29 20 28 28 78 29 2d 3e 70 53  rver(x) ((x)->pS
9820: 65 72 76 65 72 21 3d 30 29 0a 23 65 6c 73 65 0a  erver!=0).#else.
9830: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 49 73  # define pagerIs
9840: 53 65 72 76 65 72 28 78 29 20 30 0a 23 65 6e 64  Server(x) 0.#end
9850: 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  if..#ifndef NDEB
9860: 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  UG ./*.** Usage:
9870: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
9880: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
9890: 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a  ate(pPager) );.*
98a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
98b0: 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73 73  on runs many ass
98c0: 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20 66  erts to try to f
98d0: 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  ind inconsistenc
98e0: 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e  ies in.** the in
98f0: 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
9900: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
9910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9920: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
9930: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
9940: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
9950: 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d  p;..  /* State m
9960: 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f  ust be valid. */
9970: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53  .  assert( p->eS
9980: 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
9990: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
99a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
99b0: 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ER.       || p->
99c0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
99d0: 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
99e0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
99f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
9a00: 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
9a10: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9a20: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
9a30: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9a40: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9a50: 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20  _FINISHED.      
9a60: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9a70: 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a  AGER_ERROR.  );.
9a80: 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73  .  /* Regardless
9a90: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
9aa0: 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66 69  state, a temp-fi
9ab0: 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  le connection al
9ac0: 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20 2a  ways behaves.  *
9ad0: 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20 61  * as if it has a
9ae0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
9af0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
9b00: 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72 20   file. It never 
9b10: 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68 65  updates.  ** the
9b20: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
9b30: 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63 68  field, so the ch
9b40: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
9b50: 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  ag is always set
9b60: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9b70: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9b80: 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  || p->eLock==EXC
9b90: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
9ba0: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9bb0: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  File==0 || pPage
9bc0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
9bd0: 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ne );..  /* If t
9be0: 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c  he useJournal fl
9bf0: 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65  ag is clear, the
9c00: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75   journal-mode mu
9c10: 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20 20  st be "OFF". .  
9c20: 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f  ** And if the jo
9c30: 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f  urnal-mode is "O
9c40: 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  FF", the journal
9c50: 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62   file must not b
9c60: 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61  e open..  */.  a
9c70: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9c80: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9c90: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20  RNALMODE_OFF || 
9ca0: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  p->useJournal );
9cb0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9cc0: 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
9cd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9ce0: 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a   || !isOpen(p->j
9cf0: 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  fd) );..  /* Che
9d00: 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69 6d  ck that MEMDB im
9d10: 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e  plies noSync. An
9d20: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  d an in-memory j
9d30: 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20  ournal. Since . 
9d40: 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20 61   ** this means a
9d50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9d60: 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f  r performs no IO
9d70: 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e   at all, it cann
9d80: 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20  ot encounter .  
9d90: 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  ** either SQLITE
9da0: 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45  _IOERR or SQLITE
9db0: 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c  _FULL during rol
9dc0: 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20 66  lback or while f
9dd0: 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20  inalizing .  ** 
9de0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
9df0: 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69 6e  (although the in
9e00: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
9e10: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
9e20: 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  ay .  ** return 
9e30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
9e40: 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  EM while the jou
9e50: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
9e60: 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74 20  ng written). It 
9e70: 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66 6f  .  ** is therefo
9e80: 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
9e90: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
9ea0: 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
9eb0: 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20  the ERROR .  ** 
9ec0: 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  state..  */.  if
9ed0: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61  ( MEMDB ){.    a
9ee0: 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
9ef0: 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 61 73 73  ->fd) );.    ass
9f00: 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29  ert( p->noSync )
9f10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
9f20: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9f30: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9f40: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  OFF .         ||
9f50: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9f60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9f70: 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29  DE_MEMORY .    )
9f80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
9f90: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
9fa0: 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74  RROR && p->eStat
9fb0: 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e!=PAGER_OPEN );
9fc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
9fd0: 65 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29  erUseWal(p)==0 )
9fe0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  ;.  }..  /* If c
9ff0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69  hangeCountDone i
a000: 73 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45  s set, a RESERVE
a010: 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  D lock or greate
a020: 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20  r must be held. 
a030: 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e   ** on the file.
a040: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
a050: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
a060: 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50  untDone==0 || pP
a070: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  ager->eLock>=RES
a080: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a090: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a0a0: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
a0b0: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ;..  switch( p->
a0c0: 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  eState ){.    ca
a0d0: 73 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20  se PAGER_OPEN:. 
a0e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
a0f0: 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73  MDB );.      ass
a100: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a110: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a120: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a130: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
a140: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
a150: 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50  PCache)==0 || pP
a160: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
a170: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a180: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52      case PAGER_R
a190: 45 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73  EADER:.      ass
a1a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a1b0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a1c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a1d0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a1e0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a1f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a200: 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
a210: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a220: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a230: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20  RITER_LOCKED:.  
a240: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a250: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a260: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a270: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a280: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a290: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a2a0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a2c0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45  rt( p->eLock>=RE
a2d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
a2e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
a2f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
a300: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ize==pPager->dbO
a310: 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  rigSize );.     
a320: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a330: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a340: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
a350: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a360: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a370: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
a380: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a390: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a3a0: 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
a3b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a3c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a3d0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20  ITER_CACHEMOD:. 
a3e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a3f0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
a400: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a410: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a420: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a430: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61  );.      if( !pa
a440: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a450: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
a460: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
a470: 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d  hat if journal_m
a480: 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61  ode=wal here tha
a490: 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20  t neither the.  
a4a0: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
a4b0: 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41   file nor the WA
a4c0: 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e  L file are open.
a4d0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75   This happens du
a4e0: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
a4f0: 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  a rollback trans
a500: 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74  action that swit
a510: 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ches from journa
a520: 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20  l_mode=off.     
a530: 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c     ** to journal
a540: 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20  _mode=wal..     
a550: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
a560: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a570: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
a580: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a590: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a5a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a5b0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a5c0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a5d0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a5e0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a5f0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a600: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a610: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
a620: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a630: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a640: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a650: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a660: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a670: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a680: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a690: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a6a0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a6b0: 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20  RITER_DBMOD:.   
a6c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a6d0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a6e0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a6f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a700: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a710: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a720: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a730: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
a740: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a750: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a760: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a770: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a780: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a790: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a7a0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a7b0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a7c0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a7d0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a7e0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a7f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a800: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a810: 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Size<=pPager->db
a820: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
a830: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a840: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a850: 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20  FINISHED:.      
a860: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a870: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a880: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a890: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a8a0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a8b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a8c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a8d0: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a8e0: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a8f0: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
a900: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a910: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a920: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a930: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a940: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a950: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a960: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65      );.      bre
a970: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a980: 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  GER_ERROR:.     
a990: 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62   /* There must b
a9a0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
a9b0: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
a9c0: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
a9d0: 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  r if.      ** in
a9e0: 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
a9f0: 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65  herwise the page
aa00: 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  r should have al
aa10: 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20  ready dropped.  
aa20: 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f      ** back to O
aa30: 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20  PEN state..     
aa40: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
aa50: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
aa60: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
aa70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
aa80: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
aa90: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
aaa0: 63 68 65 29 3e 30 20 7c 7c 20 70 50 61 67 65 72  che)>0 || pPager
aab0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
aac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
aad0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
aae0: 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e  ndif /* ifndef N
aaf0: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
ab00: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f   SQLITE_DEBUG ./
ab10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
ab20: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
ab30: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
ab40: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
ab50: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
ab60: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
ab70: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
ab80: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
ab90: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
aba0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
abb0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
abc0: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
abd0: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
abe0: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
abf0: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
ac00: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
ac10: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
ac20: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
ac30: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
ac40: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
ac50: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
ac60: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
ac70: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
ac80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ac90: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
aca0: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
acb0: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
acc0: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
acd0: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
ace0: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
acf0: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
ad00: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
ad10: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
ad20: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
ad30: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
ad40: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
ad50: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
ad60: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
ad70: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
ad80: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
ad90: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
ada0: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
adb0: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
adc0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
add0: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
ade0: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
adf0: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
ae00: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
ae10: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
ae20: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ae30: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
ae40: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
ae50: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ae60: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
ae70: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
ae80: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ae90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aea0: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
aeb0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
aec0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
aed0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
aee0: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
aef0: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
af00: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
af10: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
af20: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
af30: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
af40: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
af50: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
af60: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
af70: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
af80: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
af90: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
afa0: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
afb0: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
afc0: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
afd0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
afe0: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
aff0: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
b000: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
b010: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
b020: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
b030: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
b040: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
b050: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
b060: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b070: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b080: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
b090: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
b0a0: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
b0b0: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
b0c0: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
b0d0: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
b0e0: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
b0f0: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
b100: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
b110: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b120: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
b130: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
b140: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b150: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b160: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
b170: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
b180: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b190: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b1a0: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
b1b0: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
b1c0: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b1d0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b1e0: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
b1f0: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
b200: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
b210: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
b220: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
b230: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
b240: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b250: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b260: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
b270: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
b280: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
b290: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
b2a0: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
b2b0: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
b2c0: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
b2d0: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
b2e0: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
b2f0: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
b300: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
b310: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
b320: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
b330: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
b340: 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  dif../* Forward 
b350: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
b360: 65 20 76 61 72 69 6f 75 73 20 70 61 67 65 20 67  e various page g
b370: 65 74 74 65 72 73 20 2a 2f 0a 73 74 61 74 69 63  etters */.static
b380: 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72 6d   int getPageNorm
b390: 61 6c 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44  al(Pager*,Pgno,D
b3a0: 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 73 74  bPage**,int);.st
b3b0: 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
b3c0: 45 72 72 6f 72 28 50 61 67 65 72 2a 2c 50 67 6e  Error(Pager*,Pgn
b3d0: 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b  o,DbPage**,int);
b3e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b3f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
b400: 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d  ic int getPageMM
b410: 61 70 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44  ap(Pager*,Pgno,D
b420: 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 65  bPage**,int);.#e
b430: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ndif../*.** Set 
b440: 74 68 65 20 50 61 67 65 72 2e 78 47 65 74 20 6d  the Pager.xGet m
b450: 65 74 68 6f 64 20 66 6f 72 20 74 68 65 20 61 70  ethod for the ap
b460: 70 72 6f 70 72 69 61 74 65 20 72 6f 75 74 69 6e  propriate routin
b470: 65 20 75 73 65 64 20 74 6f 20 66 65 74 63 68 0a  e used to fetch.
b480: 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ** content from 
b490: 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 73 74  the pager..*/.st
b4a0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 47 65 74  atic void setGet
b4b0: 74 65 72 4d 65 74 68 6f 64 28 50 61 67 65 72 20  terMethod(Pager 
b4c0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
b4d0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b4e0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
b4f0: 47 65 74 20 3d 20 67 65 74 50 61 67 65 45 72 72  Get = getPageErr
b500: 6f 72 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  or;.#if SQLITE_M
b510: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
b520: 20 7d 65 6c 73 65 20 69 66 28 20 55 53 45 46 45   }else if( USEFE
b530: 54 43 48 28 70 50 61 67 65 72 29 0a 23 69 66 64  TCH(pPager).#ifd
b540: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
b550: 44 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72  DEC.   && pPager
b560: 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64  ->xCodec==0.#end
b570: 69 66 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  if.  ){.    pPag
b580: 65 72 2d 3e 78 47 65 74 20 3d 20 67 65 74 50 61  er->xGet = getPa
b590: 67 65 4d 4d 61 70 3b 0a 23 65 6e 64 69 66 20 2f  geMMap;.#endif /
b5a0: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
b5b0: 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65  P_SIZE>0 */.  }e
b5c0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
b5d0: 3e 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4e  >xGet = getPageN
b5e0: 6f 72 6d 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ormal;.  }.}../*
b5f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b600: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
b610: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
b620: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
b630: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
b640: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
b650: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
b660: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
b670: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
b680: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
b690: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
b6a0: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
b6b0: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
b6c0: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
b6d0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
b6e0: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
b6f0: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
b700: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
b710: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
b720: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
b730: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
b740: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
b750: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
b760: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
b770: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
b780: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
b790: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
b7a0: 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  r;.  PagerSavepo
b7b0: 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70  int *p;.  Pgno p
b7c0: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
b7d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b7e0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
b7f0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
b800: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72  .    p = &pPager
b810: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
b820: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
b830: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
b840: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
b850: 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76  otNull(p->pInSav
b860: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b870: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b890: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
b8a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
b8b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b8c0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
b8d0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
b8e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
b8f0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
b900: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
b910: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
b920: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b930: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b940: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b950: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b960: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b970: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b980: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b990: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b9a0: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b9b0: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b9c0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b9d0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b9e0: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b9f0: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
ba00: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
ba10: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
ba20: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
ba30: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
ba40: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
ba50: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
ba60: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
ba70: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
ba80: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
ba90: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
baa0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
bab0: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
bac0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
bad0: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
bae0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
baf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bb00: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
bb10: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
bb20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
bb30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
bb40: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
bb50: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
bb60: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
bb70: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
bb80: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
bb90: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
bba0: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
bbb0: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
bbc0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
bbd0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
bbe0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
bbf0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
bc00: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
bc10: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
bc20: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
bc30: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
bc40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
bc50: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
bc60: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
bc70: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
bc80: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
bc90: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
bca0: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
bcb0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
bcc0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
bcd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
bce0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
bcf0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
bd00: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
bd10: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
bd20: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
bd30: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
bd40: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
bd50: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
bd60: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
bd70: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
bd80: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
bd90: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
bda0: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
bdb0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
bdc0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
bdd0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
bde0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
bdf0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
be00: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
be10: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
be20: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
be30: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
be40: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
be50: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
be60: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
be70: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
be80: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
be90: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
bea0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
beb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
bec0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
bed0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
bee0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
bef0: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
bf00: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
bf10: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
bf20: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
bf30: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
bf40: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
bf50: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
bf60: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
bf70: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
bf80: 49 73 53 65 72 76 65 72 28 70 50 61 67 65 72 29  IsServer(pPager)
bf90: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
bfa0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
bfb0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
bfc0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
bfd0: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
bfe0: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
bff0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c000: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c010: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c020: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c030: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c040: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c050: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c060: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c070: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c080: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c090: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c0a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c0b0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c0c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c0d0: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c0e0: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c0f0: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c100: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c110: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c120: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c130: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c140: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c150: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c160: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c170: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c180: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c190: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c1a0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c1b0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c1c0: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c1d0: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c1e0: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c1f0: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c200: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c210: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c220: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c230: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c240: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c250: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c260: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c270: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c280: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c290: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c2a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c2b0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c2c0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c2d0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c2e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c2f0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c300: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c310: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c320: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c330: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c340: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c350: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c360: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c370: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c380: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c390: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c3a0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c3b0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c3c0: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c3d0: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c3e0: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c3f0: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c400: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c410: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c420: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c430: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c440: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c450: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c460: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c470: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c480: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
c490: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
c4a0: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
c4b0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
c4c0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
c4d0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
c4e0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c4f0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
c500: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
c510: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
c520: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
c530: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
c540: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
c550: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
c560: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
c570: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
c580: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
c590: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
c5a0: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
c5b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
c5c0: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
c5d0: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
c5e0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
c5f0: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
c600: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
c610: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
c620: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
c630: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
c640: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
c650: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
c660: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
c670: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
c680: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
c690: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
c6a0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c6b0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
c6c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
c6d0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
c6e0: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
c6f0: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
c700: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
c710: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c720: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
c730: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
c740: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
c750: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
c760: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
c770: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
c780: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
c790: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
c7c0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
c7d0: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
c800: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
c810: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
c830: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
c840: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
c850: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
c860: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
c870: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
c880: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
c890: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
c8a0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
c8b0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
c8c0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
c8d0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
c8e0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c8f0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
c900: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
c910: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
c920: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
c930: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
c940: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
c950: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
c960: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
c970: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
c980: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
c990: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
c9a0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
c9b0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
c9c0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
c9d0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6a  #else.# define j
c9e0: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 78 29  rnlBufferSize(x)
c9f0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
ca00: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
ca10: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
ca20: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
ca30: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
ca40: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
ca50: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
ca60: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
ca70: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
ca80: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
ca90: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
caa0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
cab0: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
cac0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
cad0: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
cae0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
caf0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
cb00: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
cb10: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
cb20: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
cb30: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
cb40: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
cb50: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
cb60: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
cb70: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
cb80: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
cb90: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
cba0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
cbb0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
cbc0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
cbd0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
cbe0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
cbf0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
cc00: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
cc10: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
cc20: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
cc30: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
cc40: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
cc50: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
cc60: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
cc70: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
cc80: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
cc90: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
cca0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
ccb0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
ccc0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
ccd0: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
cce0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
ccf0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
cd00: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
cd10: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
cd20: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
cd30: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
cd40: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
cd50: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
cd60: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
cd70: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
cd80: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
cd90: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
cda0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
cdb0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
cdc0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
cdd0: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
cde0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
cdf0: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
ce00: 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70  DIRTY) || pPg->p
ce10: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
ce20: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
ce30: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
ce40: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
ce50: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
ce60: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
ce70: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
ce80: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
ce90: 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  X).#define CHECK
cea0: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
ceb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
cec0: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
ced0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
cee0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
cef0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
cf00: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
cf10: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
cf20: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
cf30: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
cf40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
cf50: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
cf60: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
cf70: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
cf80: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
cf90: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
cfa0: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
cfb0: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
cfc0: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
cfd0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
cfe0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
cff0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
d000: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d010: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
d020: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
d030: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
d040: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
d050: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
d060: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
d070: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
d080: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
d090: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
d0a0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
d0b0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
d0c0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
d0d0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
d0e0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
d0f0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
d100: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
d110: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
d120: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
d130: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
d140: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
d150: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
d160: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
d170: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
d180: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
d190: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
d1a0: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
d1b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
d1c0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
d1d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d1e0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
d1f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
d200: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
d210: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
d220: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
d230: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
d240: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
d250: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
d260: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
d270: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
d280: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
d290: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
d2a0: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
d2b0: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
d2c0: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
d2d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d2e0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
d2f0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
d300: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
d310: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
d320: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
d330: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
d340: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
d350: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
d360: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
d370: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
d380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d390: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
d3a0: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
d3b0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
d3c0: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
d3d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
d400: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
d430: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
d440: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
d450: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
d460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
d470: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
d480: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
d490: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
d4a0: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
d4b0: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
d4c0: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
d4d0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
d4e0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d500: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
d510: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
d520: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
d530: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
d540: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
d550: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
d560: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
d570: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
d580: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
d590: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
d5a0: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
d5b0: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
d5c0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d5d0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
d5e0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
d5f0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
d600: 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d  ter .   || len==
d610: 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  0 .   || SQLITE_
d620: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
d630: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
d640: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
d650: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d660: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d670: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
d680: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
d690: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
d6a0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
d6b0: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
d6c0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d6d0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
d6e0: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
d6f0: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
d700: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d710: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
d720: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
d730: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
d740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
d750: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
d760: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
d770: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
d780: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
d790: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
d7a0: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
d7b0: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
d7c0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
d7d0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
d7e0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
d7f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d800: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
d810: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
d820: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
d830: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
d840: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
d850: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
d860: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
d870: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
d880: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
d890: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
d8a0: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
d8b0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
d8c0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
d8d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
d8e0: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
d8f0: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
d900: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
d910: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
d920: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
d930: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
d940: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
d950: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
d960: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
d970: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
d980: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
d990: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
d9a0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
d9b0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
d9c0: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
d9d0: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
d9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da00: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
da70: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
da80: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
da90: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
daa0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
dab0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
dac0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
dad0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
dae0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
daf0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
db00: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
db10: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
db20: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
db30: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
db40: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
db50: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
db60: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
db70: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
db80: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
db90: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
dba0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
dbb0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
dbc0: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
dbd0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
dbe0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
dbf0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
dc00: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
dc10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
dc20: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
dc30: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
dc40: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
dc50: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
dc60: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
dc70: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
dc80: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
dc90: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
dca0: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
dcb0: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
dcc0: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
dcd0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
dce0: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
dcf0: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
dd00: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
dd10: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
dd20: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
dd30: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
dd40: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
dd50: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
dd60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
dd70: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
dd80: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
dd90: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
dda0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
ddb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ddc0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
ddd0: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
dde0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
ddf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
de00: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
de10: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
de20: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
de30: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
de40: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
de50: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
de60: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
de70: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
de80: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
de90: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
dea0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
deb0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
dec0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
ded0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
dee0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
def0: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
df00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
df10: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
df20: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
df30: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
df40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
df50: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
df60: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
df70: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
df80: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
df90: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
dfa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dfb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dfc0: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
dfd0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
dfe0: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
dff0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e000: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
e030: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
e040: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
e050: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
e060: 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49  !sqlite3JournalI
e070: 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
e080: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
e090: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e0a0: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
e0b0: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
e0c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
e0d0: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
e0e0: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
e0f0: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
e100: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
e110: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
e120: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
e130: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
e140: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e150: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
e160: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
e170: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
e180: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
e190: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
e1a0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e1b0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
e1c0: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
e1d0: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
e1e0: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
e1f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e200: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
e210: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
e220: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
e230: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
e240: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
e250: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
e260: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
e270: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
e280: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
e290: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
e2a0: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
e2b0: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
e2c0: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
e2d0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
e2e0: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
e2f0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
e300: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
e310: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
e320: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
e330: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
e340: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
e350: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
e360: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
e370: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
e380: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
e390: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
e3a0: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
e3b0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
e3c0: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
e3d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e3e0: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
e3f0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
e400: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e410: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
e420: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
e430: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
e440: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
e450: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
e460: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e470: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
e480: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
e490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e4a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e4b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
e4c0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
e4d0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
e4e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
e4f0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
e500: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
e510: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
e520: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
e530: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
e540: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
e550: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
e560: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
e570: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
e580: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
e590: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
e5a0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
e5b0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
e5c0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
e5d0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
e5e0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
e5f0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
e600: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
e610: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
e620: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
e630: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
e640: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
e650: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
e660: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e670: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
e680: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
e690: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
e6a0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
e6b0: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
e6c0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
e6d0: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
e6e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
e6f0: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
e700: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
e710: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
e720: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
e730: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
e740: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e760: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
e770: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
e780: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
e790: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
e7a0: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
e7b0: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
e7c0: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
e7d0: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
e7e0: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
e7f0: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
e800: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
e810: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
e840: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
e850: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
e860: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
e890: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
e8a0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
e8b0: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
e8c0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
e8d0: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
e8e0: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
e8f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
e900: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
e910: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
e920: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
e930: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
e940: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
e950: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
e960: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
e970: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
e980: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
e990: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
e9a0: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
e9b0: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
e9c0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
e9d0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
e9e0: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
e9f0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
ea00: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
ea10: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
ea20: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
ea30: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
ea40: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
ea50: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
ea60: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
ea70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
ea80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
ea90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
eaa0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
eab0: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
eac0: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
ead0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
eae0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
eaf0: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
eb00: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
eb10: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
eb20: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
eb30: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
eb40: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
eb50: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
eb60: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
eb70: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
eb80: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
eb90: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
eba0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
ebb0: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
ebc0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
ebd0: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
ebe0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
ebf0: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
ec00: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
ec10: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
ec20: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
ec30: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
ec40: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
ec50: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
ec60: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
ec70: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
ec80: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
ec90: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
eca0: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
ecb0: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
ecc0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
ecd0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
ece0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
ecf0: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
ed00: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
ed10: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
ed20: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
ed30: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
ed40: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
ed50: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
ed60: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
ed70: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
ed80: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
ed90: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
eda0: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
edb0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
edc0: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
edd0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
ede0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
edf0: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
ee00: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
ee10: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
ee20: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
ee30: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
ee40: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
ee50: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
ee60: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
ee70: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
ee80: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
ee90: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
eea0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
eeb0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
eec0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
eed0: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
eee0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
eef0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
ef00: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
ef10: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ef20: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
ef30: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
ef40: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
ef50: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
ef60: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
ef70: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
ef80: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
ef90: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
efa0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
efb0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
efc0: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
efd0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
efe0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
eff0: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
f000: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
f010: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
f020: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f030: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
f040: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
f050: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
f060: 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  izer */ .  sqlit
f070: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
f080: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
f090: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
f0a0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
f0b0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f0c0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f0d0: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
f0e0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
f0f0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
f100: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
f110: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
f120: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f130: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
f140: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
f150: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
f160: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
f170: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
f180: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
f190: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f1a0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f1b0: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
f1c0: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
f1d0: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
f1e0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f1f0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f200: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
f210: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
f220: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
f230: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
f240: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
f250: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
f260: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
f270: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
f280: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f290: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
f2a0: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
f2b0: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
f2c0: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
f2d0: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
f2e0: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
f2f0: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
f300: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
f310: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
f320: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
f330: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f340: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
f350: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
f360: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
f370: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
f380: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
f390: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
f3a0: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
f3b0: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
f3c0: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
f3d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
f3e0: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
f3f0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
f400: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
f410: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
f420: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
f430: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
f440: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
f450: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
f460: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
f470: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
f480: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
f490: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
f4a0: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
f4b0: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
f4c0: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
f4d0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
f4e0: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
f4f0: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
f500: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
f510: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
f520: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
f530: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
f540: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
f550: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f560: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
f570: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
f580: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
f590: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
f5a0: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
f5b0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f5c0: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
f5d0: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
f5e0: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
f5f0: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
f600: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
f610: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
f620: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
f630: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
f640: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
f650: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
f660: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
f670: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
f680: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
f690: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
f6a0: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
f6b0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
f6c0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
f6d0: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
f6e0: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
f6f0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
f700: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
f710: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
f720: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
f730: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
f740: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
f750: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
f760: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
f770: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
f780: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
f790: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
f7a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
f7b0: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
f7c0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
f7d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
f7e0: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
f7f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f800: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
f810: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f820: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
f830: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
f840: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f850: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
f860: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
f870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
f880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
f890: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
f8a0: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
f8b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
f8c0: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
f8d0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
f8e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
f8f0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f900: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
f910: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
f920: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
f930: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f940: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
f950: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f960: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
f970: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
f980: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
f990: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
f9a0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
f9b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
f9c0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
f9d0: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
f9e0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
f9f0: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
fa00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
fa10: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
fa20: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
fa30: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
fa40: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
fa50: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
fa60: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
fa70: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
fa80: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
fa90: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
faa0: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
fab0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
fac0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
fad0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
fae0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
faf0: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
fb00: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
fb10: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fb20: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
fb30: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
fb40: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
fb50: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
fb60: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
fb70: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
fb80: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
fb90: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
fba0: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
fbb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
fbc0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
fbd0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
fbe0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
fbf0: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
fc00: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
fc10: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
fc20: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
fc30: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
fc40: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
fc50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
fc60: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
fc70: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
fc80: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
fc90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fca0: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
fcb0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
fcc0: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
fcd0: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fcf0: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
fd00: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
fd10: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
fd20: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd40: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
fd50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
fd60: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
fd70: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
fd80: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
fd90: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
fda0: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
fdb0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
fdc0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
fdd0: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
fde0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
fdf0: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
fe00: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
fe10: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
fe20: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
fe30: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
fe40: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
fe50: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
fe60: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
fe70: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
fe80: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
fe90: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
fea0: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
feb0: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
fec0: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
fed0: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
fee0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fef0: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
ff00: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
ff10: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
ff20: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
ff30: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
ff40: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
ff50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ff60: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
ff70: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
ff80: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
ff90: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
ffa0: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
ffb0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
ffc0: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
ffd0: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
ffe0: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
fff0: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
10000 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
10010 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
10020 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
10030 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
10040 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
10050 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
10060 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
10070 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
10080 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
10090 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
100a0 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
100b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
100c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
100d0 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
100e0 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
100f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10110 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
10120 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
10130 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
10140 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
10150 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10160 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
10180 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
10190 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
101a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
101b0 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
101c0 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
101d0 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
101e0 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
101f0 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
10200 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
10210 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
10220 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
10230 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
10240 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
10250 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
10260 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10270 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10280 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
10290 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
102a0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
102b0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
102c0 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
102d0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
102e0 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
102f0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
10300 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10310 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
10320 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
10330 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10340 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
10350 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
10360 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
10370 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10380 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
10390 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
103a0 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
103b0 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
103c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
103d0 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
103e0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
103f0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
10400 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
10410 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
10420 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
10430 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
10440 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10450 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
10460 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10470 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
10480 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
10490 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
104a0 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
104b0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
104c0 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
104d0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
104e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
104f0 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
10500 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
10510 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
10520 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
10530 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
10540 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
10550 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
10560 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
10570 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
10580 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
10590 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
105a0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
105b0 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
105c0 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
105d0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
105e0 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
105f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
10600 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
10610 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
10620 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
10630 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
10640 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
10650 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
10660 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
10670 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
10680 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
10690 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
106a0 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
106b0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
106c0 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
106d0 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
106e0 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
106f0 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
10700 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
10710 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
10720 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
10730 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
10740 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
10750 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
10760 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
10770 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
10780 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
10790 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
107a0 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
107b0 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
107c0 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
107d0 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
107e0 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
107f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10800 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
10810 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
10820 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
10830 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
10840 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
10850 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
10860 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
10870 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10880 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
10890 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
108a0 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
108b0 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
108c0 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
108d0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
108e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
108f0 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
10900 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10910 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
10920 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10930 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
10940 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
10950 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10960 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
10970 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
10980 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
10990 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
109a0 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
109b0 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
109c0 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
109d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
109e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
109f0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
10a00 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
10a10 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
10a20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10a30 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
10a40 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
10a50 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
10a60 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
10a70 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
10a80 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
10a90 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
10aa0 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
10ab0 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
10ac0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
10ad0 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
10ae0 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
10af0 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
10b00 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
10b10 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
10b20 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
10b30 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
10b40 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
10b50 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
10b60 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10b70 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10b80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10b90 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
10ba0 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
10bb0 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
10bc0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
10bd0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10be0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
10bf0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
10c00 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
10c10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10c20 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
10c30 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
10c40 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
10c50 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
10c60 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10c70 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10c80 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10c90 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
10ca0 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
10cb0 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
10cc0 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
10cd0 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
10ce0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
10cf0 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
10d00 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
10d10 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
10d20 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
10d30 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
10d40 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
10d50 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
10d60 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10d70 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10d80 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10d90 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
10da0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
10db0 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
10dc0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
10dd0 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
10de0 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
10df0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
10e00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10e10 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
10e20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
10e30 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
10e40 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
10e50 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
10e60 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10e70 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10e80 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10e90 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
10ea0 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
10eb0 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
10ec0 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
10ed0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
10ee0 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
10ef0 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
10f00 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
10f10 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
10f20 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
10f30 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10f40 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
10f50 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
10f60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10f70 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10f80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10fb0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
10fc0 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
10fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
10fe0 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
10ff0 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
11000 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11020 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
11030 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
11040 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
11050 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
11060 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11070 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
11080 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
11090 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
110b0 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
110c0 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
110d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
110e0 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
110f0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
11100 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
11110 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
11120 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
11130 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
11140 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11150 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21  _MEMORY .   || !
11160 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
11170 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  fd).  ){.    ret
11180 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11190 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
111a0 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
111b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
111c0 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
111d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
111e0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
111f0 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
11200 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
11210 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
11220 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
11230 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
11240 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
11250 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
11260 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
11270 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
11280 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
11290 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
112a0 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
112b0 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
112c0 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
112d0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
112e0 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
112f0 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
11300 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
11310 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
11320 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
11330 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
11340 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
11350 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
11360 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
11370 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
11380 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
11390 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
113a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
113b0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
113c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
113d0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
113e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
113f0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
11400 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
11410 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
11420 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
11430 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
11440 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
11450 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
11460 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
11470 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
11480 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11490 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
114a0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
114b0 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
114c0 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
114d0 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
114e0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
114f0 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11500 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
11510 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
11520 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11530 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11540 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
11550 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
11560 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
11570 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
11580 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
11590 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a  ournalMagic, 8,.
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115c0 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
115d0 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
115e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
115f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11600 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
11610 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
11620 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
11630 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
11640 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
11650 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
11660 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
11670 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
11680 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
11690 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
116a0 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
116b0 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
116c0 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
116d0 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
116e0 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
116f0 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
11700 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
11710 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
11720 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
11730 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
11740 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
11750 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
11760 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
11770 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
11780 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
11790 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
117a0 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
117b0 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
117c0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
117d0 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
117e0 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
117f0 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
11800 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
11810 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
11820 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
11830 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
11840 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
11850 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11860 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
11870 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11880 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
11890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
118a0 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
118b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69   rc;.}../*.** Di
118c0 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
118d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
118e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d   in-memory page-
118f0 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
11900 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
11910 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
11920 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74  {.  pPager->iDat
11930 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71  aVersion++;.  sq
11940 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
11950 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
11960 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  up);.  sqlite3Pc
11970 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
11980 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
11990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
119a0 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
119b0 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33  sion value.*/.u3
119c0 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 61  2 sqlite3PagerDa
119d0 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20  taVersion(Pager 
119e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
119f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
11a00 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  te>PAGER_OPEN );
11a10 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
11a20 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a  ->iDataVersion;.
11a30 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
11a40 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  l structures in 
11a50 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
11a60 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64  oint[] array and
11a70 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67   set both.** Pag
11a80 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e  er.aSavepoint an
11a90 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69  d Pager.nSavepoi
11aa0 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73  nt to zero. Clos
11ab0 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  e the sub-journa
11ac0 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70  l.** if it is op
11ad0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  en and the pager
11ae0 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11af0 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74  sive mode..*/.st
11b00 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
11b10 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50  eAllSavepoints(P
11b20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11b30 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
11b40 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
11b50 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  or for looping t
11b60 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61  hrough Pager.aSa
11b70 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72  vepoint */.  for
11b80 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
11b90 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
11ba0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
11bb0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
11bc0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11bd0 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
11be0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  t);.  }.  if( !p
11bf0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11c00 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 4a  Mode || sqlite3J
11c10 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79  ournalIsInMemory
11c20 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11c30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11c40 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11c50 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11c60 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
11c70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
11c80 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11c90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11ca0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
11cb0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
11cc0 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
11cd0 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
11ce0 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
11cf0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
11d00 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
11d10 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
11d20 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11d40 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11d50 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
11d60 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
11d70 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
11d80 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
11d90 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
11da0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11db0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
11dc0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
11dd0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11de0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
11df0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11e00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11e10 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
11e20 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11e30 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11e40 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11e50 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
11e60 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11e70 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
11e80 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
11e90 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
11ea0 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
11eb0 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
11ec0 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
11ed0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
11ee0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
11ef0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
11f00 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
11f10 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
11f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11f40 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11f50 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
11f60 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11f70 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
11f80 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11f90 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
11fa0 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
11fb0 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
11fc0 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
11fd0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11fe0 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11ff0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
12000 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
12010 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
12020 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
12030 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
12040 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
12050 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
12060 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
12070 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
12080 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
12090 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
120a0 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
120b0 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
120c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
120d0 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
120e0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
120f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12100 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
12110 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12120 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
12130 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
12140 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
12150 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
12160 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
12170 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
12180 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
12190 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
121a0 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
121b0 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
121c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
121d0 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
121e0 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
121f0 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
12200 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
12210 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
12220 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
12230 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
12240 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
12250 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
12260 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
12270 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12280 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
12290 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
122a0 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
122b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
122c0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
122d0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
122e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
122f0 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
12300 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
12310 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
12320 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
12330 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
12340 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
12350 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
12360 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
12370 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
12380 0a 20 20 69 66 28 20 70 61 67 65 72 49 73 53 65  .  if( pagerIsSe
12390 72 76 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a  rver(pPager) ){.
123a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 72 76 65      sqlite3Serve
123b0 72 45 6e 64 28 70 50 61 67 65 72 2d 3e 70 53 65  rEnd(pPager->pSe
123c0 72 76 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  rver);.    pPage
123d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
123e0 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  R_OPEN;.  }else 
123f0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 61  .#endif.  if( pa
12400 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
12410 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
12420 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
12430 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c  >jfd) );.    sql
12440 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
12450 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
12460 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61  ->pWal);.    pPa
12470 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12480 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GER_OPEN;.  }els
12490 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
124a0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
124b0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
124e0 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65  returned by page
124f0 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20  rUnlockDb() */. 
12500 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f     int iDc = isO
12510 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f  pen(pPager->fd)?
12520 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
12530 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
12540 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20  Pager->fd):0;.. 
12550 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65     /* If the ope
12560 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75  rating system su
12570 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f  pport deletion o
12580 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68  f open files, th
12590 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20  en.    ** close 
125a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
125b0 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
125c0 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
125d0 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  .  Otherwise.   
125e0 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   ** another conn
125f0 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
12600 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
12610 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65  might delete the
12620 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74   file.    ** out
12630 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
12640 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12650 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12660 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26  LMODE_MEMORY   &
12670 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12680 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12690 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
126a0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
126b0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
126c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
126d0 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
126e0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
126f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
12700 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20  ELETE   & 5)!=1 
12710 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12720 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12730 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d  E_TRUNCATE & 5)=
12740 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12750 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12760 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20  MODE_PERSIST  & 
12770 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  5)==1 );.    if(
12780 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54   0==(iDc & SQLIT
12790 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
127a0 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20  BLE_WHEN_OPEN). 
127b0 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65      || 1!=(pPage
127c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26  r->journalMode &
127d0 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   5).    ){.     
127e0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
127f0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
12800 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
12810 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
12820 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
12830 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  nd the call to u
12840 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
12850 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66  se.    ** file f
12860 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75  ails, set the cu
12870 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e  rrent lock to UN
12880 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
12890 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20  the comment.    
128a0 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  ** above the #de
128b0 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e  fine for UNKNOWN
128c0 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
128d0 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20  lanation of why 
128e0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e  this.    ** is n
128f0 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
12900 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
12910 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
12920 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  NO_LOCK);.    if
12930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12940 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
12950 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e==PAGER_ERROR )
12960 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
12970 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f  eLock = UNKNOWN_
12980 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LOCK;.    }..   
12990 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74   /* The pager st
129a0 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67  ate may be chang
129b0 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52  ed from PAGER_ER
129c0 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ROR to PAGER_OPE
129d0 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69  N here.    ** wi
129e0 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74  thout clearing t
129f0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  he error code. T
12a00 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e  his is intention
12a10 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20  al - the error. 
12a20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c     ** code is cl
12a30 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61  eared and the ca
12a40 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65  che reset in the
12a50 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20   block below..  
12a60 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
12a70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12a80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
12a90 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
12aa0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
12ab0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12ac0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
12ad0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
12ae0 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PEN;.  }..  /* I
12af0 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
12b00 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
12b10 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12b20 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
12b30 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20  e.  ** trusted. 
12b40 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61  Now that there a
12b50 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
12b60 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
12b70 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20  the pager,.  ** 
12b80 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f  it can safely mo
12b90 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ve back to PAGER
12ba0 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69  _OPEN state. Thi
12bb0 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74  s happens in bot
12bc0 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e  h.  ** normal an
12bd0 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  d exclusive-lock
12be0 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing mode..  */. 
12bf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12c00 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
12c10 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  _OK || !MEMDB );
12c20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
12c30 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  rrCode ){.    if
12c40 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
12c50 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  le==0 ){.      p
12c60 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
12c70 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
12c80 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12c90 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  e = 0;.      pPa
12ca0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12cb0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  GER_OPEN;.    }e
12cc0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
12cd0 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73 4f  r->eState = (isO
12ce0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
12cf0 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20   ? PAGER_OPEN : 
12d00 50 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a 20  PAGER_READER);. 
12d10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53 45     }.    if( USE
12d20 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20  FETCH(pPager) ) 
12d30 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
12d40 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
12d50 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  0);.    pPager->
12d60 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
12d70 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65 74 74  _OK;.    setGett
12d80 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
12d90 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
12da0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12db0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12dc0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
12dd0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
12de0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
12df0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12e00 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e  lled whenever an
12e10 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65   IOERR or FULL e
12e20 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72  rror that requir
12e30 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  es.** the pager 
12e40 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e  to transition in
12e50 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
12e60 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75  te may ahve occu
12e70 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72  rred..** The fir
12e80 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
12e90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12ea0 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
12eb0 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
12ec0 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
12ed0 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
12ee0 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
12ef0 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
12f00 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72   .** value retur
12f10 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
12f20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12f30 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
12f40 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
12f50 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12f60 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46  ment is SQLITE_F
12f70 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
12f80 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a  R or one of the.
12f90 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64  ** IOERR sub-cod
12fa0 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e  es, the pager en
12fb0 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73  ters the ERROR s
12fc0 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72  tate and the err
12fd0 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74  or code.** is st
12fe0 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72  ored in Pager.er
12ff0 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65  rCode. While the
13000 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69   pager remains i
13010 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
13020 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20  e,.** all major 
13030 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  API calls on the
13040 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
13050 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50  diately return P
13060 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a  ager.errCode..**
13070 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74  .** The ERROR st
13080 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ate indicates th
13090 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
130a0 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
130b0 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
130c0 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
130d0 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
130e0 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
130f0 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
13100 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
13110 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
13120 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
13130 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
13140 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
13150 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
13160 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
13170 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
13180 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
13190 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
131a0 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
131b0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
131c0 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
131d0 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
131e0 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
131f0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
13200 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
13210 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
13220 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
13230 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
13240 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
13250 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
13260 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
13270 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
13280 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
13290 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
132a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
132b0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
132c0 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
132d0 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
132e0 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
132f0 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
13300 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
13310 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
13320 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
13330 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
13340 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  GER_ERROR;.    s
13350 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
13360 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
13370 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
13380 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
13390 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
133a0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
133b0 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72 69  ;../*.** The wri
133c0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
133d0 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20 69 73  pen on pPager is
133e0 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
133f0 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a 2a 2a   (bCommit==1).**
13400 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
13410 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a 2a 2a  (bCommit==0)..**
13420 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
13430 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
13440 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 73  ll dirty pages s
13450 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65 64  hould be flushed
13460 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
13470 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  Rules:.**.**   *
13480 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50 20 64    For non-TEMP d
13490 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61 79 73  atabases, always
134a0 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e 20 20   sync to disk.  
134b0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
134c0 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20 74 72  y.**      for tr
134d0 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20 62 65  ansactions to be
134e0 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20   durable..**.** 
134f0 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50 20 64    *  Sync TEMP d
13500 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f 6e 20  atabase only on 
13510 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20 61 20  a COMMIT (not a 
13520 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e 20 74  ROLLBACK) when t
13530 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20 20 20  he backing.**   
13540 20 20 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e     file has been
13550 20 63 72 65 61 74 65 64 20 61 6c 72 65 61 64 79   created already
13560 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20 6f 6e   (via a spill on
13570 20 70 61 67 65 72 53 74 72 65 73 73 28 29 29 20   pagerStress()) 
13580 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68 65 6e  and.**      when
13590 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
135a0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 6d 65  irty pages in me
135b0 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32 35 25  mory exceeds 25%
135c0 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a 2a 2a   of the total.**
135d0 20 20 20 20 20 20 63 61 63 68 65 20 73 69 7a 65        cache size
135e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
135f0 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d  pagerFlushOnComm
13600 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
13610 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
13620 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
13630 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75  mpFile==0 ) retu
13640 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62 43 6f  rn 1;.  if( !bCo
13650 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  mmit ) return 0;
13660 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
13670 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74  Pager->fd) ) ret
13680 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
13690 28 73 71 6c 69 74 65 33 50 43 61 63 68 65 50 65  (sqlite3PCachePe
136a0 72 63 65 6e 74 44 69 72 74 79 28 70 50 61 67 65  rcentDirty(pPage
136b0 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32 35 29  r->pPCache)>=25)
136c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
136d0 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
136e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
136f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
13700 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
13710 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
13720 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
13730 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
13740 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
13750 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
13760 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
13770 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
13780 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13790 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
137a0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
137b0 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
137c0 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
137d0 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
137e0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
137f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
13800 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13810 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
13820 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
13830 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
13840 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
13850 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
13860 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
13870 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
13880 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
13890 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
138a0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
138b0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
138c0 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
138d0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
138e0 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
138f0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
13900 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
13910 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
13920 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
13930 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
13940 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
13950 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
13960 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
13970 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
13980 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
13990 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
139a0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
139b0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
139c0 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
139d0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
139e0 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
139f0 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
13a00 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
13a10 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
13a20 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
13a30 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
13a40 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13a50 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
13a60 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
13a70 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
13a80 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
13a90 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
13aa0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
13ab0 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
13ac0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
13ad0 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
13ae0 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
13af0 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
13b00 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
13b10 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13b20 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
13b30 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
13b40 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
13b50 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
13b60 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
13b70 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
13b80 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
13b90 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
13ba0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13bb0 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
13bc0 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13bd0 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13be0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13bf0 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13c00 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13c10 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13c20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13c30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13c40 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
13c50 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
13c60 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
13c70 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
13c80 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
13c90 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
13ca0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
13cb0 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
13cc0 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13cd0 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13ce0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13cf0 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13d00 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13d10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13d20 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13d30 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13d40 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
13d50 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
13d60 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
13d70 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
13d80 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
13d90 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
13da0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13db0 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
13dc0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13dd0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13de0 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13df0 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13e00 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13e10 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13e20 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13e30 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13e40 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
13e50 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
13e60 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
13e70 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
13e80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
13e90 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
13ea0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
13eb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13ec0 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13ed0 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13ee0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13ef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13f00 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13f10 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13f20 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13f30 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13f40 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
13f50 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
13f60 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
13f70 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
13f80 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
13f90 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
13fa0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
13fb0 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
13fc0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13fd0 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13fe0 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13ff0 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
14000 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
14010 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
14020 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
14030 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
14040 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
14050 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
14060 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
14070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14080 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14090 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
140a0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
140b0 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
140c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
140d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
140e0 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
140f0 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
14100 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
14110 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
14120 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
14130 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
14140 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
14150 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
14160 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
14170 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
14180 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
14190 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
141a0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
141b0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
141c0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
141d0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
141e0 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
141f0 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
14200 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
14210 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
14220 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
14230 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
14240 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
14250 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
14260 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
14270 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
14280 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
14290 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
142a0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
142b0 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
142c0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
142d0 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
142e0 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
142f0 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
14300 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
14310 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
14320 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
14330 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
14340 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
14350 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
14360 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
14370 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
14380 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
14390 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
143a0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
143b0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
143c0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
143d0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
143e0 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
143f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
14400 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
14410 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
14420 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
14430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
14440 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
14450 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
14460 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14470 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
14480 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
14490 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
144a0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
144b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
144c0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
144d0 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
144e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
144f0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
14500 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
14510 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
14520 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
14530 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
14540 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
14550 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
14560 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
14570 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
14580 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
14590 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
145a0 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ory(pPager->jfd)
145b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   ){.      /* ass
145c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
145d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
145e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
145f0 52 59 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  RY ); */.      s
14600 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
14610 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
14620 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
14630 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14640 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14650 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
14660 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
14670 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
14680 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14690 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
146a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
146b0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
146c0 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
146d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
146e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
146f0 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  & pPager->fullSy
14700 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
14710 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
14720 20 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69   new file size i
14730 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
14740 68 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61  he inode right a
14750 77 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  way..          *
14760 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  * Otherwise the 
14770 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65  journal might re
14780 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e  surrect followin
14790 67 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61  g a power loss a
147a0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
147b0 63 61 75 73 65 20 74 68 65 20 6c 61 73 74 20 74  cause the last t
147c0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f  ransaction to ro
147d0 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20  ll back.  See.  
147e0 20 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73          ** https
147f0 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69  ://bugzilla.mozi
14800 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67  lla.org/show_bug
14810 2e 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a  .cgi?id=1072773.
14820 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
14830 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14840 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
14850 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
14860 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  yncFlags);.     
14870 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14880 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
14890 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
148a0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
148b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
148c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
148d0 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c  PERSIST.      ||
148e0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
148f0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
14900 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
14910 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14920 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20  E_WAL).    ){.  
14930 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75      rc = zeroJou
14940 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
14950 68 61 73 4d 61 73 74 65 72 7c 7c 70 50 61 67 65  hasMaster||pPage
14960 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
14970 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
14980 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
14990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
149a0 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20  This branch may 
149b0 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68  be executed with
149c0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
149d0 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20  de==MEMORY if.  
149e0 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75      ** a hot-jou
149f0 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f  rnal was just ro
14a00 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68  lled back. In th
14a10 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
14a20 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
14a30 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  e should be clos
14a40 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20  ed and deleted. 
14a50 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  If this connecti
14a60 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20  on writes to.   
14a70 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
14a80 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c  se file, it will
14a90 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20   do so using an 
14aa0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
14ab0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
14ac0 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20    int bDelete = 
14ad0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
14ae0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
14af0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49   sqlite3JournalI
14b00 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
14b10 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a 20 20 20  ->jfd)==0 );.   
14b20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14b30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14b40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14b50 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
14b60 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14b70 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14b80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14b90 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
14ba0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14bb0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14bc0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
14bd0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14be0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
14bf0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
14c00 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29     if( bDelete )
14c10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14c20 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
14c30 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
14c40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
14c50 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
14c60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14c70 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
14c80 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14c90 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
14ca0 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
14cb0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
14cc0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
14cd0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14ce0 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
14cf0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
14d00 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
14d10 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
14d20 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50  dr *p = sqlite3P
14d30 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
14d40 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
14d50 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
14d60 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
14d70 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
14d80 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20  efNotNull(p);.  
14d90 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14da0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
14db0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
14dc0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
14dd0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
14de0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14df0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
14e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14e10 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
14e20 7c 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f  | pagerFlushOnCo
14e30 6d 6d 69 74 28 70 50 61 67 65 72 2c 20 62 43 6f  mmit(pPager, bCo
14e40 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 20 20 73  mmit) ){.      s
14e50 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
14e60 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
14e70 61 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ache);.    }else
14e80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14e90 63 61 63 68 65 43 6c 65 61 72 57 72 69 74 61 62  cacheClearWritab
14ea0 6c 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  le(pPager->pPCac
14eb0 68 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  he);.    }.    s
14ec0 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
14ed0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
14ee0 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
14ef0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Size);.  }..  if
14f00 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
14f10 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
14f20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69  Drop the WAL wri
14f30 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e  te-lock, if any.
14f40 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f   Also, if the co
14f50 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nnection was in 
14f60 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f  .    ** locking_
14f70 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
14f80 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f  ode but is no lo
14f90 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45  nger, drop the E
14fa0 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a  XCLUSIVE .    **
14fb0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
14fc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20  .    */.    rc2 
14fe0 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57  = sqlite3WalEndW
14ff0 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
15000 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
15010 20 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d     assert( rc2==
15020 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
15030 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
15040 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69  ITE_OK && bCommi
15050 74 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46  t && pPager->dbF
15060 69 6c 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e  ileSize>pPager->
15070 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  dbSize ){.    /*
15080 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
15090 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69  taken when commi
150a0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
150b0 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d  ion in rollback-
150c0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d  journal.    ** m
150d0 6f 64 65 20 69 66 20 74 68 65 20 64 61 74 61 62  ode if the datab
150e0 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
150f0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
15100 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
15110 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68  ge..    ** At th
15120 69 73 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75  is point the jou
15130 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69  rnal has been fi
15140 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20  nalized and the 
15150 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
15160 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
15170 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20   committed, but 
15180 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
15190 63 6b 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ck is still held
151a0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
151b0 69 6c 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61  ile. So it is sa
151c0 66 65 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  fe to truncate t
151d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
151e0 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a   to its minimum.
151f0 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20      ** required 
15200 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73  size.  */.    as
15210 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
15220 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
15230 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
15240 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
15250 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  Pager, pPager->d
15260 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  bSize);.  }..  i
15270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15280 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69   && bCommit && i
15290 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
152a0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
152b0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
152c0 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
152d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d  QLITE_FCNTL_COMM
152e0 49 54 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b  IT_PHASETWO, 0);
152f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15300 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72  ITE_NOTFOUND ) r
15310 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15320 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
15330 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
15340 0a 20 20 69 66 28 20 70 61 67 65 72 49 73 53 65  .  if( pagerIsSe
15350 72 76 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a  rver(pPager) ){.
15360 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
15370 33 53 65 72 76 65 72 52 65 6c 65 61 73 65 57 72  3ServerReleaseWr
15380 69 74 65 4c 6f 63 6b 73 28 70 50 61 67 65 72 2d  iteLocks(pPager-
15390 3e 70 53 65 72 76 65 72 29 3b 0a 20 20 7d 65 6c  >pServer);.  }el
153a0 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  se.#endif.  if( 
153b0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
153c0 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21  veMode .   && (!
153d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
153e0 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61  er) || sqlite3Wa
153f0 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
15400 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29  Pager->pWal, 0))
15410 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  .  ){.    rc2 = 
15420 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
15430 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
15440 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
15450 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
15460 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
15470 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
15480 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67  R_READER;.  pPag
15490 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
154a0 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  0;..  return (rc
154b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
154c0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  rc);.}../*.** Ex
154d0 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
154e0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
154f0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
15500 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
15510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a  atabase file. .*
15520 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15530 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
15540 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
15550 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74  state, do not at
15560 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f  tempt .** the ro
15570 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74  llback at this t
15580 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61  ime. Instead, pa
15590 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
155a0 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63  called. The.** c
155b0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
155c0 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61  ock() will disca
155d0 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
155e0 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a   pages, unlock.*
155f0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
15600 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ile and move the
15610 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f   pager back to O
15620 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68  PEN state. If th
15630 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  is .** means tha
15640 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  t there is a hot
15650 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e  -journal left in
15660 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
15670 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63  , the next .** c
15680 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74  onnection to obt
15690 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
156a0 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28  k on the pager (
156b0 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69  which may be thi
156c0 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20  s one) .** will 
156d0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
156e0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
156f0 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
15700 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
15710 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  OR state, but an
15720 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
15730 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
15740 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
15750 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
15760 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
15770 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
15780 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74  ter the ERROR st
15790 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
157a0 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
157b0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
157c0 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
157d0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
157e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
157f0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
15800 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
15810 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
15820 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
15830 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67  ER_ERROR && pPag
15840 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
15850 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73  R_OPEN ){.    as
15860 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
15870 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
15880 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
15890 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
158a0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
158b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
158c0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
158d0 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
158e0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
158f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
15900 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
15910 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
15920 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
15930 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
15940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15950 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
15960 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
15970 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74       pager_end_t
15980 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
15990 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, 0, 0);.    }.
159a0 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
159b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
159c0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
159d0 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
159e0 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
159f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15a00 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
15a10 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
15a20 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
15a30 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
15a40 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
15a50 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
15a60 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
15a70 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
15a80 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
15a90 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
15aa0 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
15ab0 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
15ac0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
15ad0 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
15ae0 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
15af0 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
15b00 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
15b10 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
15b20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
15b30 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
15b40 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
15b50 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
15b60 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
15b70 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
15b80 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
15b90 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
15ba0 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
15bb0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
15bc0 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
15bd0 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
15be0 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
15bf0 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
15c00 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
15c10 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
15c20 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
15c30 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
15c40 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
15c50 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
15c60 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
15c70 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
15c80 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
15c90 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
15ca0 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
15cb0 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
15cc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
15cd0 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
15ce0 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
15cf0 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
15d00 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
15d10 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
15d20 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
15d30 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
15d40 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
15d50 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
15d60 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
15d70 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
15d80 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
15d90 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
15da0 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
15db0 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
15dc0 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
15dd0 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
15de0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
15df0 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
15e00 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
15e10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15e20 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
15e30 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
15e40 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
15e50 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
15e60 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
15e70 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
15e80 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
15e90 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
15ea0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15eb0 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
15ec0 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
15ed0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
15ee0 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
15ef0 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
15f00 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15f10 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15f20 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
15f30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
15f40 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
15f50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
15f60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f80 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
15f90 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15fa0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
15fb0 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
15fc0 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
15fd0 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
15fe0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
15ff0 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
16000 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
16010 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61  S_CODEC./*.** Ma
16020 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62  ke sure the numb
16030 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
16040 69 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20  its is the same 
16050 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  in the destinati
16060 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69  on.** pager as i
16070 74 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72  t is in the sour
16080 63 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20  ce.  This comes 
16090 75 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d  up when a VACUUM
160a0 20 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20   changes the.** 
160b0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
160c0 65 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22  ed bits to the "
160d0 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e  optimal" amount.
160e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
160f0 50 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76  PagerAlignReserv
16100 65 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20  e(Pager *pDest, 
16110 50 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20  Pager *pSrc){.  
16120 69 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65  if( pDest->nRese
16130 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65  rve!=pSrc->nRese
16140 72 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74  rve ){.    pDest
16150 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72  ->nReserve = pSr
16160 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  c->nReserve;.   
16170 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16180 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  (pDest);.  }.}.#
16190 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
161a0 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
161b0 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
161c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
161d0 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
161e0 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
161f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
16200 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
16210 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
16220 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
16230 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
16240 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
16250 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
16260 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
16270 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
16280 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
16290 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
162a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
162b0 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
162c0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
162d0 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
162e0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
162f0 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
16300 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
16310 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
16320 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
16330 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16340 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
16350 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
16360 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
16370 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
16380 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
16390 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
163a0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
163b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
163c0 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
163d0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
163e0 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
163f0 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
16400 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
16410 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
16420 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
16430 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
16440 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
16450 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
16460 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
16470 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
16480 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
16490 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
164a0 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
164b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
164c0 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
164d0 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
164e0 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
164f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16500 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
16510 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
16520 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
16530 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
16540 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
16550 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
16560 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
16570 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
16580 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
16590 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
165a0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
165b0 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
165c0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
165d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
165e0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
165f0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
16600 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
16610 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
16620 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
16630 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
16640 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
16650 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
16660 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
16670 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
16680 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
16690 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
166a0 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
166b0 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
166c0 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
166d0 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
166e0 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
166f0 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
16700 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
16710 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
16720 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
16730 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
16740 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
16750 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
16760 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
16770 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
16780 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
16790 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
167a0 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
167b0 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
167c0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
167d0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
167e0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
167f0 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
16800 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
16810 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
16820 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
16830 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
16840 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
16850 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
16860 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
16870 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
16880 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
16890 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
168a0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
168b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
168d0 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
168e0 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
168f0 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16910 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
16920 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
16930 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
16940 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16950 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
16960 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
16970 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
16980 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
16990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
169a0 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
169b0 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
169c0 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
169d0 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
169e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
169f0 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
16a00 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
16a10 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
16a20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
16a30 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
16a40 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
16a50 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
16a60 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
16a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16a80 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16a90 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
16aa0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
16ab0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
16ac0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
16ad0 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
16ae0 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
16af0 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16b10 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
16b20 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
16b30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
16b40 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
16b50 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
16b60 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
16b70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16b80 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
16b90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16ba0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
16bb0 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
16bc0 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
16bd0 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
16be0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
16bf0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
16c00 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
16c10 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
16c20 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
16c30 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
16c40 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
16c50 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
16c60 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
16c70 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
16c80 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
16c90 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
16ca0 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
16cb0 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
16cc0 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
16cd0 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
16ce0 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
16cf0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
16d00 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
16d10 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
16d20 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
16d30 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
16d40 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
16d50 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
16d60 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
16d70 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
16d80 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
16d90 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
16da0 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
16db0 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
16dc0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
16dd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
16de0 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
16df0 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
16e00 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
16e10 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
16e20 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
16e30 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16e40 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
16e50 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16e60 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
16e70 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
16e80 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
16e90 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16ea0 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
16eb0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
16ec0 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
16ed0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
16ee0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
16ef0 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
16f00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16f10 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
16f20 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
16f30 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
16f40 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
16f50 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
16f60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
16f70 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
16f80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16f90 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16fa0 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
16fb0 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
16fc0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16fd0 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
16fe0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
16ff0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
17000 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
17010 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
17020 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
17030 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
17040 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
17050 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
17060 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
17070 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
17080 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
17090 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
170a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
170b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
170c0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
170d0 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
170e0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
170f0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
17100 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
17110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17120 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
17130 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
17140 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
17150 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
17160 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
17170 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
17180 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
17190 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
171a0 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
171b0 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
171c0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
171d0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
171e0 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
171f0 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
17200 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
17210 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
17220 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
17230 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
17240 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
17250 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
17260 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
17270 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
17280 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
17290 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
172a0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
172b0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
172c0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
172d0 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
172e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
172f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
17300 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
17310 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
17320 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
17330 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
17340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17350 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
17360 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
17370 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
17380 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
17390 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
173a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
173b0 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
173c0 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
173d0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
173e0 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
173f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17400 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
17410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17420 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
17430 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
17440 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69  back before duri
17450 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
17460 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
17470 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
17480 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
17490 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
174a0 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
174b0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
174c0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
174d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
174e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
174f0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
17500 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
17510 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
17520 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
17530 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
17540 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
17550 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
17560 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
17570 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
17580 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
17590 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
175a0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
175b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
175c0 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
175d0 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
175e0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
175f0 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
17600 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
17610 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
17620 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
17630 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
17640 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
17650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17660 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
17670 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
17680 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
17690 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
176a0 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
176b0 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
176c0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
176d0 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
176e0 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
176f0 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
17700 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
17710 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
17720 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
17730 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
17740 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
17750 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
17760 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
17770 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
17780 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
17790 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
177a0 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
177b0 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
177c0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
177d0 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
177e0 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
177f0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
17800 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
17810 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
17820 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
17830 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
17840 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
17850 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
17860 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
17870 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
17880 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
17890 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
178a0 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
178b0 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
178c0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
178d0 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
178e0 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
178f0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
17900 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
17910 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
17920 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
17930 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
17940 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17950 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
17960 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
17970 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
17980 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
17990 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
179a0 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
179b0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
179c0 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
179d0 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
179e0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
179f0 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
17a00 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
17a10 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
17a20 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
17a30 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
17a40 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
17a50 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
17a60 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
17a70 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
17a80 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
17a90 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
17aa0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
17ab0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
17ac0 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
17ad0 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
17ae0 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
17af0 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17b00 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
17b10 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
17b20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
17b30 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
17b40 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
17b50 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
17b60 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
17b70 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
17b80 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
17b90 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17ba0 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
17bb0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
17bc0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
17bd0 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
17be0 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
17bf0 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
17c00 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
17c10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
17c20 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
17c30 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
17c40 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
17c50 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
17c60 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17c70 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
17c80 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
17c90 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
17ca0 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
17cb0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
17cc0 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
17cd0 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
17ce0 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
17cf0 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
17d00 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
17d10 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
17d20 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
17d30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
17d40 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
17d50 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
17d60 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
17d70 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
17d80 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
17d90 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
17da0 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
17db0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
17dc0 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
17dd0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
17de0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17df0 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
17e00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17e10 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
17e20 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
17e30 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
17e40 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
17e50 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
17e60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
17e70 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
17e80 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  g==0 || pPager->
17e90 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41  tempFile );.  PA
17ea0 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
17eb0 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
17ec0 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
17ed0 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
17ee0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
17ef0 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
17f00 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
17f10 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
17f20 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
17f30 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
17f40 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
17f50 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
17f60 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
17f70 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
17f80 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
17f90 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
17fa0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17fb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17fc0 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
17fd0 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
17fe0 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
17ff0 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
18000 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
18010 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50  r->fd).   && (pP
18020 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
18030 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
18040 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
18050 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
18060 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
18070 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
18080 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
18090 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
180a0 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
180b0 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
180c0 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
180d0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
180e0 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
180f0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
18100 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
18110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18120 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
18130 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
18140 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18150 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  e, ofst);.    if
18160 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
18170 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
18180 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
18190 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
181a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
181b0 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
181c0 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
181d0 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
181e0 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
181f0 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20  MEM_BKPT);.     
18200 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
18210 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
18220 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
18230 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43  )aData);.      C
18240 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44  ODEC2(pPager, aD
18250 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63  ata, pgno, 7, rc
18260 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
18270 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  PT, aData);.    
18280 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
18290 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
182a0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
182b0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
182c0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
182d0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
182e0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
182f0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
18300 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
18310 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
18320 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
18330 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
18340 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
18350 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
18360 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
18370 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
18380 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
18390 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
183a0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
183b0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
183c0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
183d0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
183e0 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
183f0 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
18400 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
18410 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
18420 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
18430 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
18440 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
18450 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
18460 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
18470 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
18480 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
18490 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
184a0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
184b0 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
184c0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
184d0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
184e0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
184f0 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
18500 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
18510 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
18520 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
18530 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
18540 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
18550 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
18560 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
18570 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
18580 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
18590 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
185a0 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
185b0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
185c0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
185d0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
185e0 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
185f0 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
18600 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
18610 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
18620 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
18630 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
18640 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
18650 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
18660 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
18670 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
18680 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18690 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ACK;.    rc = sq
186a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
186b0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
186c0 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
186d0 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
186e0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
186f0 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29  G_ROLLBACK)!=0 )
18700 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
18710 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
18720 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b  LLFLAG_ROLLBACK;
18730 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18740 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
18750 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  rc;.    sqlite3P
18760 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
18770 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Pg);.  }.  if( p
18780 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
18790 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
187a0 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
187b0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
187c0 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
187d0 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
187e0 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
187f0 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
18800 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
18810 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
18820 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
18830 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
18840 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
18850 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
18860 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
18870 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
18880 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
18890 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
188a0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
188b0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
188c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
188d0 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44  d *pData;.    pD
188e0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
188f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
18900 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  ta, (u8*)aData, 
18910 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18920 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  );.    pPager->x
18930 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
18940 20 20 20 2f 2a 20 49 74 20 75 73 65 64 20 74 6f     /* It used to
18950 20 62 65 20 74 68 61 74 20 73 71 6c 69 74 65 33   be that sqlite3
18960 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
18970 70 50 67 29 20 77 61 73 20 63 61 6c 6c 65 64 20  pPg) was called 
18980 68 65 72 65 2e 20 20 42 75 74 0a 20 20 20 20 2a  here.  But.    *
18990 2a 20 74 68 61 74 20 63 61 6c 6c 20 77 61 73 20  * that call was 
189a0 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 68 61  dangerous and ha
189b0 64 20 6e 6f 20 64 65 74 65 63 74 61 62 6c 65 20  d no detectable 
189c0 62 65 6e 65 66 69 74 20 73 69 6e 63 65 20 74 68  benefit since th
189d0 65 20 63 61 63 68 65 0a 20 20 20 20 2a 2a 20 69  e cache.    ** i
189e0 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e  s normally clean
189f0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
18a00 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66  cheCleanAll() af
18a10 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ter rollback and
18a20 20 73 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20 62   so.    ** has b
18a30 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a  een removed. */.
18a40 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
18a50 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20  gehash(pPg);..  
18a60 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
18a70 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
18a80 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
18a90 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
18aa0 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
18ab0 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
18ac0 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
18ad0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
18ae0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
18af0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
18b00 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
18b10 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
18b20 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
18b30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
18b40 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
18b50 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
18b60 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
18b70 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
18b80 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
18b90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18ba0 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  T);.    sqlite3P
18bb0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
18bc0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18bd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
18be0 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
18bf0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
18c00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18c10 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
18c20 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
18c30 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
18c40 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18c50 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
18c60 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
18c70 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
18c80 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
18c90 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
18ca0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
18cb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
18cc0 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
18cd0 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
18ce0 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
18cf0 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
18d00 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
18d10 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
18d20 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
18d30 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
18d40 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
18d50 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
18d60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
18d70 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
18d80 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
18d90 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
18da0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
18db0 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
18dc0 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
18dd0 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
18de0 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
18df0 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
18e00 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
18e10 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
18e20 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
18e30 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
18e40 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
18e50 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
18e60 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
18e70 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
18e80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
18e90 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
18ea0 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
18eb0 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
18ec0 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
18ed0 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
18ee0 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
18ef0 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
18f00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
18f10 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
18f20 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
18f30 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
18f40 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
18f50 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
18f60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18f70 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
18f80 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
18f90 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
18fa0 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
18fb0 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
18fc0 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
18fd0 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
18fe0 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
18ff0 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
19000 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
19010 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
19020 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
19030 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
19040 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
19050 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
19060 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
19070 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
19080 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
19090 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
190a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
190b0 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
190c0 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
190d0 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
190e0 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
190f0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
19100 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
19110 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
19120 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
19130 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
19140 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
19150 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
19160 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
19170 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
19180 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
19190 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
191a0 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
191b0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
191c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
191d0 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
191e0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
191f0 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
19200 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
19210 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
19220 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
19230 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
19240 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
19250 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
19260 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
19270 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
19280 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
19290 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
192a0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
192b0 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
192c0 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
192d0 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
192e0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
192f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19300 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
19310 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
19320 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
19330 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
19340 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
19350 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
19360 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19370 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
19380 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19390 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
193a0 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
193b0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
193c0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
193d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
193e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
193f0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
19400 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
19410 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
19420 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
19430 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
19440 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
19450 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
19460 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
19470 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
19480 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
19490 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
194a0 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
194b0 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
194c0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
194d0 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
194e0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
194f0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
19500 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
19510 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
19520 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
19530 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c  r to one journal
19540 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20   within MJ file 
19550 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
19560 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f  erPtr;         /
19570 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
19580 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d  MJ filename from
19590 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
195a0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
195b0 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Ptr;           /
195c0 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  * Amount of spac
195d0 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a  e allocated to z
195e0 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a  MasterPtr[] */..
195f0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
19600 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ace for both the
19610 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d   pJournal and pM
19620 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72  aster file descr
19630 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20  iptors..  ** If 
19640 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e  successful, open
19650 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19660 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61  nal file for rea
19670 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ding..  */.  pMa
19680 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
19690 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
196a0 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73  llocZero(pVfs->s
196b0 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
196c0 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
196d0 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
196e0 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
196f0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
19700 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
19710 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19720 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
19730 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
19740 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
19750 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
19760 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
19770 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
19780 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19790 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
197a0 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
197b0 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
197c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
197d0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
197e0 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  r_out;..  /* Loa
197f0 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
19800 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19810 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
19820 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73  ined from.  ** s
19830 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
19840 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
19850 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
19860 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a  .   Also obtain.
19870 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20    ** sufficient 
19880 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65  space (in zMaste
19890 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68  rPtr) to hold th
198a0 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65  e names of maste
198b0 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  r.  ** journal f
198c0 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66  iles extracted f
198d0 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c  rom regular roll
198e0 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20  back-journals.. 
198f0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
19900 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
19910 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
19920 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
19930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19940 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19950 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  ;.  nMasterPtr =
19960 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
19970 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  e+1;.  zMasterJo
19980 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
19990 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
199a0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
199b0 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
199c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
199d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
199e0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
199f0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19a00 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
19a10 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
19a20 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
19a30 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  rc 
19a40 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
19a50 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
19a60 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
19a70 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
19a80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19a90 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19aa0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d  master_out;.  zM
19ab0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
19ac0 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
19ad0 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
19ae0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
19af0 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
19b00 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
19b10 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
19b20 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
19b30 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
19b40 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
19b50 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
19b60 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
19b70 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
19b80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19b90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
19ba0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19bb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
19bc0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
19bd0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
19be0 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
19bf0 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
19c00 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
19c10 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
19c20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
19c30 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
19c40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
19c50 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
19c60 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
19c70 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
19c80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
19c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
19ca0 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
19cb0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
19cc0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19cd0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
19ce0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
19cf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
19d00 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
19d10 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
19d20 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19d40 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19d50 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19d60 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
19d70 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
19d80 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
19d90 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
19da0 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
19db0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
19dc0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
19dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19de0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19df0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19e00 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
19e10 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
19e20 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
19e30 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
19e40 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
19e50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
19e60 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
19e70 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
19e80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19e90 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
19ea0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19eb0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
19ec0 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
19ed0 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
19ee0 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
19ef0 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
19f00 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
19f10 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19f20 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
19f30 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
19f40 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
19f50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
19f60 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19f70 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
19f80 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19f90 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
19fa0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19fb0 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
19fc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
19fd0 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
19fe0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
19ff0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1a000 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
1a010 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
1a020 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1a030 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
1a040 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
1a050 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
1a060 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
1a070 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
1a080 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
1a090 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1a0a0 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
1a0b0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
1a0c0 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
1a0d0 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
1a0e0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
1a0f0 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
1a100 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
1a110 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
1a120 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
1a130 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1a140 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
1a150 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
1a160 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
1a170 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
1a180 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
1a190 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1a1a0 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
1a1b0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
1a1c0 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
1a1d0 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
1a1e0 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
1a1f0 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
1a200 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
1a210 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
1a220 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  r, it might be t
1a230 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
1a240 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
1a250 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
1a260 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
1a270 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
1a280 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
1a290 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
1a2a0 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
1a2b0 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
1a2c0 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
1a2d0 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
1a2e0 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
1a2f0 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
1a300 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
1a310 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
1a320 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
1a330 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
1a340 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
1a350 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
1a360 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1a370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
1a380 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1a390 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
1a3a0 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
1a3b0 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
1a3c0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
1a3d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1a3e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a3f0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
1a400 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1a410 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
1a420 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a430 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a440 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
1a450 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
1a460 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
1a470 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
1a480 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  .  .  if( isOpen
1a490 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  (pPager->fd) .  
1a4a0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1a4b0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1a4c0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1a4d0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1a4e0 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20  _OPEN) .  ){.   
1a4f0 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
1a500 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69  , newSize;.    i
1a510 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67  nt szPage = pPag
1a520 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1a530 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a540 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
1a550 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f  VE_LOCK );.    /
1a560 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
1a570 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
1a580 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
1a590 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1a5a0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1a5b0 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
1a5c0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
1a5d0 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28  wSize = szPage*(
1a5e0 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
1a5f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a600 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
1a610 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
1a620 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
1a630 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
1a640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a650 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
1a660 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
1a670 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1a680 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73  ( (currentSize+s
1a690 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20  zPage)<=newSize 
1a6a0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1a6b0 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e  *pTmp = pPager->
1a6c0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20  pTmpSpace;.     
1a6d0 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20     memset(pTmp, 
1a6e0 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  0, szPage);.    
1a6f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
1a700 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d  ewSize-szPage) =
1a710 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b  = currentSize );
1a720 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a730 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
1a740 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69  ge) >  currentSi
1a750 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ze );.        rc
1a760 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1a770 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54  e(pPager->fd, pT
1a780 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53  mp, szPage, newS
1a790 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20  ize-szPage);.   
1a7a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1a7b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a7c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a7d0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
1a7e0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
1a7f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1a800 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1a810 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76  rn a sanitized v
1a820 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65  ersion of the se
1a830 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20  ctor-size of OS 
1a840 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a  file pFile. The.
1a850 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1a860 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1a870 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20   lie between 32 
1a880 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  and MAX_SECTOR_S
1a890 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IZE..*/.int sqli
1a8a0 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71  te3SectorSize(sq
1a8b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1a8c0 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d  e){.  int iRet =
1a8d0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
1a8e0 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69  Size(pFile);.  i
1a8f0 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20  f( iRet<32 ){.  
1a900 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20    iRet = 512;.  
1a910 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d  }else if( iRet>M
1a920 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
1a930 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
1a940 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
1a950 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d  12 );.    iRet =
1a960 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a970 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1a980 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Ret;.}../*.** Se
1a990 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
1a9a0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1a9b0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
1a9c0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
1a9d0 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
1a9e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a9f0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1aa00 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
1aa10 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1aa20 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
1aa30 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1aa40 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
1aa50 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
1aa60 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
1aa70 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
1aa80 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
1aa90 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
1aaa0 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
1aab0 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
1aac0 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
1aad0 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
1aae0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1aaf0 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
1ab00 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
1ab10 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
1ab20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1ab30 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1ab40 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
1ab50 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1ab60 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1ab70 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
1ab80 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
1ab90 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
1aba0 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
1abb0 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
1abc0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
1abd0 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
1abe0 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
1abf0 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _SIZE..**.** If 
1ac00 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65  the file has the
1ac10 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1ac20 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1ac30 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  E property, then
1ac40 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65   set.** the effe
1ac50 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1ac60 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d  e to its minimum
1ac70 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54   value (512).  T
1ac80 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a  he purpose of.**
1ac90 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1aca0 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65  ize is to define
1acb0 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69   the "blast radi
1acc0 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61  us" of bytes tha
1acd0 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
1ace0 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63  e if a crash occ
1acf0 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e  urs while writin
1ad00 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79  g to a single by
1ad10 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61  te in.** that ra
1ad20 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50  nge.  But with P
1ad30 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1ad40 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61  TE, the blast ra
1ad50 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  dius is zero.** 
1ad60 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f  (that is what PO
1ad70 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1ad80 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20  E means), so we 
1ad90 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63  minimize the sec
1ada0 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f  tor.** size.  Fo
1adb0 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
1adc0 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  atibility of the
1add0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1ade0 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a  l file format,.*
1adf0 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75  * we cannot redu
1ae00 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1ae10 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c   sector size bel
1ae20 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69  ow 512..*/.stati
1ae30 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
1ae40 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
1ae50 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
1ae60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1ae70 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1ae80 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
1ae90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1aea0 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
1aeb0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1aec0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1aed0 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20  d) & .          
1aee0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1aef0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1af00 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RITE)!=0.  ){.  
1af10 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
1af20 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
1af30 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1af40 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
1af50 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
1af60 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
1af70 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
1af80 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
1af90 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1afa0 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
1afb0 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ult. */.    pPag
1afc0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1afd0 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   512;.  }else{. 
1afe0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1aff0 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53  rSize = sqlite3S
1b000 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1b010 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->fd);.  }.}../*
1b020 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
1b030 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
1b040 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
1b050 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
1b060 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
1b070 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
1b080 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
1b090 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
1b0a0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1b0b0 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
1b0c0 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
1b0d0 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
1b0e0 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
1b0f0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
1b100 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
1b110 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1b120 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1b130 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
1b140 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
1b150 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
1b160 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
1b170 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1b180 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
1b190 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
1b1a0 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
1b1b0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
1b1c0 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
1b1d0 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
1b1e0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1b1f0 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
1b200 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
1b210 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
1b220 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
1b230 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
1b240 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1b250 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b260 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
1b270 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
1b280 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
1b290 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
1b2a0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b2b0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b2c0 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
1b2d0 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
1b2e0 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
1b2f0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
1b300 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
1b310 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1b320 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1b330 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
1b340 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
1b350 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
1b360 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
1b370 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
1b380 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
1b390 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
1b3a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
1b3b0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1b3c0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1b3d0 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
1b3e0 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1b3f0 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
1b400 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
1b410 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
1b420 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
1b430 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1b440 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
1b450 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
1b460 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
1b470 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
1b480 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
1b490 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
1b4a0 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
1b4b0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
1b4c0 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
1b4d0 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
1b4e0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
1b4f0 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
1b500 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1b510 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
1b520 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
1b530 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
1b540 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
1b550 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1b560 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
1b570 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
1b580 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
1b590 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
1b5a0 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
1b5b0 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
1b5c0 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
1b5d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1b5e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
1b5f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1b600 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
1b610 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
1b620 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
1b630 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
1b640 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
1b650 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
1b660 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
1b670 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
1b680 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
1b690 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
1b6a0 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
1b6b0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
1b6c0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
1b6d0 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
1b6e0 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
1b6f0 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1b700 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
1b710 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
1b720 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
1b730 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
1b740 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
1b750 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
1b760 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
1b770 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
1b780 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
1b790 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
1b7a0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
1b7b0 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
1b7c0 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
1b7d0 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
1b7e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1b7f0 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
1b800 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
1b810 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
1b820 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
1b830 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
1b840 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1b850 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
1b860 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
1b870 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
1b880 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
1b890 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
1b8a0 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
1b8b0 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
1b8c0 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
1b8d0 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
1b8e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1b8f0 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
1b900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
1b910 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
1b920 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1b930 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
1b940 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
1b950 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
1b960 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
1b970 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
1b980 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1b990 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
1b9a0 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
1b9b0 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
1b9c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b9d0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
1b9e0 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
1b9f0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
1ba00 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1ba10 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
1ba20 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
1ba30 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
1ba40 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
1ba50 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
1ba60 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
1ba70 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
1ba80 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
1ba90 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
1baa0 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
1bab0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1bac0 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
1bad0 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
1bae0 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
1baf0 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
1bb00 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
1bb10 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
1bb20 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
1bb30 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
1bb40 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
1bb50 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
1bb60 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1bb70 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
1bb80 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1bb90 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1bba0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1bbc0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1bbd0 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
1bbe0 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
1bc10 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
1bc20 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1bc50 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
1bc60 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
1bc70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1bc80 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
1bc90 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
1bca0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1bcc0 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
1bcd0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1bce0 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
1bcf0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1bd00 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1bd10 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1bd20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1bd30 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1bd40 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
1bd50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1bd60 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
1bd70 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
1bd80 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
1bd90 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
1bda0 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
1bdb0 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  back */.  int nP
1bdc0 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20  layback = 0;    
1bdd0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1bde0 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74  er of pages rest
1bdf0 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ored from journa
1be00 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  l */..  /* Figur
1be10 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
1be20 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
1be30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
1be40 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
1be50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
1be60 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
1be70 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1be80 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
1be90 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1bea0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1beb0 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
1bec0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bed0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1bee0 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
1bef0 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
1bf00 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
1bf10 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1bf20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
1bf30 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
1bf40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1bf50 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
1bf60 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
1bf70 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
1bf80 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
1bf90 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1bfa0 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
1bfb0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1bfc0 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
1bfd0 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
1bfe0 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
1bff0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1c000 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
1c010 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
1c020 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
1c030 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
1c040 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
1c050 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
1c060 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
1c070 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c080 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
1c090 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
1c0a0 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
1c0b0 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d  ,.  ** mxPathnam
1c0c0 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1c0d0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1c0e0 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1c0f0 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1c100 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1c110 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1c120 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1c130 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1c140 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1c150 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1c160 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1c170 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1c180 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c190 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1c1a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1c1b0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1c1c0 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1c1d0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1c1e0 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1c1f0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1c200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1c210 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1c220 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c230 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1c240 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1c250 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1c260 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1c270 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1c280 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1c290 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1c2a0 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1c2b0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1c2c0 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1c2d0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1c2e0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1c2f0 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1c300 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1c310 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1c320 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1c330 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1c340 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1c350 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1c360 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1c370 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1c380 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1c390 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1c3a0 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1c3b0 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1c3c0 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1c3d0 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1c3e0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1c3f0 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1c400 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1c410 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1c420 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1c430 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1c440 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1c450 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1c460 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1c470 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c480 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1c490 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1c4a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c4b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c4c0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1c4d0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1c4e0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1c4f0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1c500 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1c510 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1c520 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1c530 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1c540 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1c550 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c560 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1c570 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1c580 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1c590 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1c5a0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1c5b0 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1c5c0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1c5d0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1c5e0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1c5f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c600 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1c610 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c620 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c630 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1c640 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1c650 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1c660 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1c670 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1c680 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1c690 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1c6a0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1c6b0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1c6c0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1c6d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1c6e0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1c6f0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1c700 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1c710 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1c720 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1c730 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1c740 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1c750 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1c760 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1c770 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1c780 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1c790 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1c7a0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1c7b0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1c7c0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1c7d0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1c7e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1c7f0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1c800 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1c810 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1c820 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1c830 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1c840 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1c850 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1c860 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1c870 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1c880 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1c890 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1c8a0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1c8b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1c8c0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1c8d0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1c8e0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1c8f0 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1c900 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1c910 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1c920 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c930 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1c940 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1c950 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1c960 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1c970 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1c980 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1c990 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1c9a0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1c9b0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1c9c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1c9d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c9e0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1c9f0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1ca00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1ca10 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1ca20 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1ca30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1ca40 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1ca50 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1ca60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1ca70 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1ca80 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1ca90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1caa0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1cab0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1cac0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1cad0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1cae0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1caf0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1cb00 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1cb10 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1cb20 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1cb30 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1cb40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1cb50 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1cb60 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1cb70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cb80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1cb90 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1cba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1cbb0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1cbc0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1cbd0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1cbe0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1cbf0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1cc00 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1cc10 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1cc20 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1cc30 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1cc40 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1cc50 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1cc60 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1cc70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1cc80 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1cc90 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1cca0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1ccb0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1ccc0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1ccd0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1cce0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ccf0 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1cd00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cd10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50  OK ){.        nP
1cd20 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  layback++;.     
1cd30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cd40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1cd50 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1cd60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cd70 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1cd80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cd90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1cda0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1cdb0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1cdc0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1cdd0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1cde0 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1cdf0 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1ce00 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1ce10 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1ce20 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1ce30 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1ce40 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1ce50 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1ce60 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1ce70 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1ce80 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1ce90 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1cea0 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1ceb0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1cec0 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1ced0 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1cee0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1cef0 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1cf00 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1cf10 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1cf20 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1cf30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cf40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1cf50 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1cf60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cf70 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1cf80 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1cf90 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1cfa0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1cfb0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1cfc0 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1cfd0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1cfe0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1cff0 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1d000 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1d010 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1d020 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1d030 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1d040 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1d050 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1d060 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1d070 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1d080 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1d090 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1d0a0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1d0b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d0c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1d0d0 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1d0e0 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1d0f0 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1d100 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1d110 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1d120 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1d130 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1d140 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1d150 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1d160 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1d170 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1d180 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1d190 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1d1a0 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1d1b0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1d1c0 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1d1d0 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1d1e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1d1f0 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1d200 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ied..  */.#ifdef
1d210 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1d220 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
1d230 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1d240 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1d250 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
1d260 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
1d270 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
1d280 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1d290 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62  /* If this playb
1d2a0 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67  ack is happening
1d2b0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1d2c0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
1d2d0 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c   IO or .  ** mal
1d2e0 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f  loc error that o
1d2f0 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68  ccurred after th
1d300 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d310 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74   was updated but
1d320 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68   .  ** before th
1d330 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
1d340 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  s committed, the
1d350 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1d360 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  nter .  ** modif
1d370 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74  ication may just
1d380 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72   have been rever
1d390 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70  ted. If this hap
1d3a0 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76  pens in exclusiv
1d3b0 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68  e .  ** mode, th
1d3c0 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72  en subsequent tr
1d3d0 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f  ansactions perfo
1d3e0 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e  rmed by the conn
1d3f0 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a  ection will not.
1d400 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20    ** update the 
1d410 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1d420 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20  t all. This may 
1d430 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e  lead to cache in
1d440 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a  consistency.  **
1d450 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74   problems for ot
1d460 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74  her processes at
1d470 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1d480 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a  he future. So, j
1d490 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ust.  ** in case
1d4a0 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e   this has happen
1d4b0 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68  ed, clear the ch
1d4c0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
1d4d0 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  ag now..  */.  p
1d4e0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1d4f0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1d500 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1d510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d520 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
1d530 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1d540 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
1d550 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1d560 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1d570 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1d580 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1d590 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d5a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d5b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d5c0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28  QLITE_OK.   && (
1d5d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1d5e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1d5f0 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1d600 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1d610 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
1d620 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1d630 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
1d640 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1d660 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1d670 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
1d680 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c  Master[0]!='\0',
1d690 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   0);.    testcas
1d6a0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1d6b0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1d6c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1d6d0 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
1d6e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1d6f0 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
1d700 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
1d710 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1d720 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
1d730 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
1d740 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
1d750 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1d760 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
1d770 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d780 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
1d790 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1d7a0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1d7b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1d7c0 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50   if( isHot && nP
1d7d0 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  layback ){.    s
1d7e0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
1d7f0 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
1d800 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f  _ROLLBACK, "reco
1d810 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20 66  vered %d pages f
1d820 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20  rom %s",.       
1d830 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61           nPlayba
1d840 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ck, pPager->zJou
1d850 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rnal);.  }..  /*
1d860 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1d870 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1d880 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1d890 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1d8a0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1d8b0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1d8c0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1d8d0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1d8e0 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1d8f0 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1d900 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1d910 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1d920 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1d930 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1d940 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d950 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1d960 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1d970 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1d980 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d990 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1d9a0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1d9b0 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1d9c0 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1d9d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1d9e0 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1d9f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1da00 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1da10 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1da20 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1da30 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1da40 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1da50 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1da60 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1da70 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1da80 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1da90 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1daa0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1dab0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1dac0 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1dad0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1dae0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1daf0 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1db00 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33  e(PgHdr *pPg, u3
1db10 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67  2 iFrame){.  Pag
1db20 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1db30 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1db40 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1db50 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1db60 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
1db70 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
1db80 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1db90 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
1dba0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1dbb0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1dbc0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1dbd0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1dbe0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1dbf0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1dc00 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1dc10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dc20 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1dc30 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1dc40 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1dc50 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1dc60 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1dc70 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28  E_OMIT_WAL.  if(
1dc80 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f   iFrame ){.    /
1dc90 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68  * Try to pull th
1dca0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1dcb0 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e  write-ahead log.
1dcc0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1dcd0 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65  ite3WalReadFrame
1dce0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69  (pPager->pWal, i
1dcf0 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67  Frame, pgsz, pPg
1dd00 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  ->pData);.  }els
1dd10 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1dd20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1dd30 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1dd40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1dd50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1dd60 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1dd70 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1dd80 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  sz, iOffset);.  
1dd90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dda0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1ddb0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1ddc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ddd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f  .  }..  if( pgno
1dde0 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1ddf0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1de00 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1de10 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1de20 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1de30 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1de40 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1de50 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1de60 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1de70 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1de80 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1de90 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1dea0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1deb0 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1dec0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1ded0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1dee0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1def0 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1df00 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1df10 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1df20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1df30 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1df40 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1df50 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1df60 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1df70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1df80 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1df90 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1dfa0 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1dfb0 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1dfc0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1dfd0 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1dfe0 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1dff0 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1e000 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1e010 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1e020 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1e030 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1e040 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1e050 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31  noise equaling 1
1e060 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
1e070 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
1e080 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
1e090 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
1e0a0 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
1e0b0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
1e0c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e0d0 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
1e0e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e0f0 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
1e100 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
1e110 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
1e120 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
1e130 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1e140 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1e150 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
1e160 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1e170 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
1e180 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
1e190 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
1e1a0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
1e1b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1e1c0 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1e1d0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1e1e0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1e1f0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1e200 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1e210 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1e220 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1e230 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
1e240 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
1e250 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1e260 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e270 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1e280 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1e290 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1e2a0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1e2b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1e2c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1e2d0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1e2e0 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e  at offsets 24 an
1e2f0 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68  d 92 in.** the h
1e300 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71  eader and the sq
1e310 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  lite version num
1e320 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
1e330 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1e340 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  an unconditional
1e350 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c   update.  See al
1e360 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63  so the pager_inc
1e370 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1e380 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69  ).** routine whi
1e390 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20  ch only updates 
1e3a0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1e3b0 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65  er if the update
1e3c0 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20   is actually.** 
1e3d0 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72  needed, as deter
1e3e0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61  mined by the pPa
1e3f0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1e400 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61  Done state varia
1e410 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1e420 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f  oid pager_write_
1e430 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67  changecounter(Pg
1e440 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32  Hdr *pPg){.  u32
1e450 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1e460 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1e470 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
1e480 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
1e490 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
1e4a0 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63  4. */.  change_c
1e4b0 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
1e4c0 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
1e4d0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  g->pPager->dbFil
1e4e0 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33  eVers)+1;.  put3
1e4f0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1e500 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  g->pData)+24, ch
1e510 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
1e520 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
1e530 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
1e540 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
1e550 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
1e560 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e  .  ** bytes 92..
1e570 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61  95 store the cha
1e580 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge counter for 
1e590 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f  which the versio
1e5a0 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73  n number.  ** is
1e5b0 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74   valid. */.  put
1e5c0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1e5d0 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63  Pg->pData)+92, c
1e5e0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1e5f0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1e600 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1e610 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49  96, SQLITE_VERSI
1e620 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23  ON_NUMBER);.}..#
1e630 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e640 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_WAL./*.** Thi
1e650 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
1e660 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  voked once for e
1e670 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61  ach page that ha
1e680 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a  s already been .
1e690 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
1e6a0 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65  the log file whe
1e6b0 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  n a WAL transact
1e6c0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1e6d0 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ck..** Parameter
1e6e0 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65   iPg is the page
1e6f0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20   number of said 
1e700 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61  page. The pCtx a
1e710 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61  rgument .** is a
1e720 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
1e730 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1e740 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
1e750 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70  If page iPg is p
1e760 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61  resent in the ca
1e770 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20  che, and has no 
1e780 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1e790 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73  rences,.** it is
1e7a0 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65   discarded. Othe
1e7b0 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
1e7c0 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
1e7d0 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72  outstanding.** r
1e7e0 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70  eferences, the p
1e7f0 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72  age content is r
1e800 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65  eloaded from the
1e810 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
1e820 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  e.** attempt to 
1e830 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66  reload content f
1e840 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e850 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64   is required and
1e860 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75   fails, .** retu
1e870 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
1e880 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
1e890 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
1e8a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1e8b0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76  erUndoCallback(v
1e8c0 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20  oid *pCtx, Pgno 
1e8d0 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  iPg){.  int rc =
1e8e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1e8f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1e900 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50  ager *)pCtx;.  P
1e910 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
1e920 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1e930 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  l(pPager) );.  p
1e940 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1e950 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1e960 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1e970 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1e980 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1e990 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1e9a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1e9b0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1e9c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
1e9d0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20  32 iFrame = 0;. 
1e9e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e9f0 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
1ea00 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d  ager->pWal, pPg-
1ea10 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b  >pgno, &iFrame);
1ea20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1ea30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ea40 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1ea50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
1ea60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ea70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ea80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1ea90 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
1eaa0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1eab0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1eac0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  nrefNotNull(pPg)
1ead0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1eae0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1eaf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1eb00 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
1eb10 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1eb20 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
1eb30 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
1eb40 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
1eb50 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1eb60 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
1eb70 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
1eb80 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
1eb90 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
1eba0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
1ebb0 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
1ebc0 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
1ebd0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
1ebe0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
1ebf0 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
1ec00 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
1ec10 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1ec20 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1ec30 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
1ec40 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
1ec50 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
1ec60 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
1ec70 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
1ec80 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
1ec90 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
1eca0 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
1ecb0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1ecc0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
1ecd0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
1ece0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1ecf0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ed00 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ed10 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
1ed20 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
1ed30 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
1ed40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ed50 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
1ed60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1ed70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed90 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1eda0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
1edd0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
1ede0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
1edf0 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1ee00 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
1ee10 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
1ee20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
1ee30 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
1ee40 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
1ee50 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
1ee60 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
1ee70 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
1ee80 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
1ee90 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
1eea0 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
1eeb0 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
1eec0 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
1eed0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
1eee0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1eef0 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
1ef00 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1ef10 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1ef20 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
1ef30 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
1ef40 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
1ef50 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1ef60 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
1ef70 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
1ef80 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1ef90 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1efa0 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
1efb0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1efc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1efd0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1efe0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1eff0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1f000 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1f010 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1f020 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1f030 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1f040 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f050 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f060 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1f070 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1f080 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1f090 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1f0a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1f0b0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1f0c0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1f0d0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1f0e0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1f0f0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1f100 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1f110 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1f120 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1f130 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1f140 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1f150 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1f160 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1f170 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1f180 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1f190 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1f1a0 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1f1b0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1f1c0 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1f1d0 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1f1e0 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1f1f0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1f200 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1f230 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1f240 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f250 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f260 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1f270 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1f280 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f290 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1f2a0 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1f2b0 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1f2c0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1f2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f2e0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1f2f0 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  commit */.){.  i
1f300 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f320 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1f330 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20  .  int nList;   
1f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f350 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f360 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a  pages in pList *
1f370 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  /.  PgHdr *p;   
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f390 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1f3a0 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f  ng over pages */
1f3b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1f3c0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1f3d0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1f3e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1f3f0 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1f400 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1f410 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1f420 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1f430 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1f440 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1f450 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1f460 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1f470 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1f480 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1f490 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44  ssert( pList->pD
1f4a0 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d  irty==0 || isCom
1f4b0 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43  mit );.  if( isC
1f4c0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1f4d0 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1f4e0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1f4f0 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1f500 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1f510 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1f520 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1f530 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1f540 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1f550 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1f560 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1f570 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1f580 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1f590 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1f5a0 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1f5b0 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1f5c0 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1f5d0 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1f5e0 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b  ;.    nList = 0;
1f5f0 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1f600 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21  ; (*ppNext = p)!
1f610 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  =0; p=p->pDirty)
1f620 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1f630 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29  gno<=nTruncate )
1f640 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74  {.        ppNext
1f650 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20   = &p->pDirty;. 
1f660 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a         nList++;.
1f670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f680 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1f690 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f6a0 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  nList = 1;.  }. 
1f6b0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
1f6c0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
1f6d0 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66   += nList;..  if
1f6e0 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
1f6f0 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
1f700 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
1f710 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  st);.  rc = sqli
1f720 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
1f730 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
1f740 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1f750 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
1f760 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
1f770 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
1f780 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
1f790 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f7a0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
1f7b0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   ){.    for(p=pL
1f7c0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1f7d0 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
1f7e0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1f7f0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1f800 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
1f810 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
1f820 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
1f830 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1f840 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1f850 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1f860 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f870 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
1f880 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1f890 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  ){.    pager_set
1f8a0 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
1f8b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1f8c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f8d0 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
1f8e0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1f8f0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
1f900 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
1f910 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
1f920 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
1f930 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
1f940 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
1f950 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
1f960 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
1f970 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
1f980 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
1f990 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
1f9a0 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
1f9b0 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
1f9c0 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
1f9d0 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
1f9e0 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
1f9f0 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
1fa00 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1fa10 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
1fa20 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
1fa30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1fa40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1fa70 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
1fa80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1fa90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1faa0 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
1fab0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1fac0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1fad0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1fae0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1faf0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
1fb00 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1fb10 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
1fb20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
1fb30 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1fb40 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
1fb50 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
1fb60 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
1fb70 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
1fb80 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
1fb90 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
1fba0 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
1fbb0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1fbc0 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
1fbd0 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
1fbe0 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
1fbf0 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
1fc00 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
1fc10 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
1fc20 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1fc30 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1fc40 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
1fc50 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
1fc60 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1fc70 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
1fc80 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
1fc90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
1fca0 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
1fcb0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1fcc0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
1fcd0 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
1fce0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
1fcf0 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
1fd00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1fd10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1fd20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1fd30 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
1fd40 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
1fd50 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
1fd60 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
1fd70 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
1fd80 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1fd90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fda0 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
1fdb0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
1fdc0 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
1fdd0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
1fde0 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
1fdf0 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
1fe00 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
1fe10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1fe20 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1fe30 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1fe40 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
1fe50 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
1fe60 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1fe70 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
1fe80 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1fe90 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
1fea0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
1feb0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1fec0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1fed0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1fee0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1fef0 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
1ff00 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1ff30 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
1ff40 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
1ff50 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1ff60 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1ff70 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
1ff80 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
1ff90 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
1ffa0 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
1ffb0 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
1ffc0 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
1ffd0 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
1ffe0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1fff0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
20000 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
20010 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
20020 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
20030 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
20040 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
20050 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
20060 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
20070 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
20080 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
20090 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
200a0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
200b0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
200c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
200d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
200e0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
200f0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
20100 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20110 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
20120 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
20130 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
20140 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
20150 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
20160 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
20170 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76  tabase is not av
20180 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
20190 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79  .  ** WAL sub-sy
201a0 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  stem, determine 
201b0 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 65 20  the page counte 
201c0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a  based on the siz
201d0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61  e of.  ** the da
201e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
201f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20210 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e  s not an.  ** in
20220 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
20230 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
20240 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72 65   round up the re
20250 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
20260 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 41 4c 57   nPage==0 && ALW
20270 41 59 53 28 69 73 4f 70 65 6e 28 70 50 61 67 65  AYS(isOpen(pPage
20280 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 69  r->fd)) ){.    i
20290 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
202b0 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20  Size of db file 
202c0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
202d0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
202e0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
202f0 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20  r->fd, &n);.    
20300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20310 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
20320 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
20330 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28  nPage = (Pgno)((
20340 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n+pPager->pageSi
20350 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e  ze-1) / pPager->
20360 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
20370 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
20380 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
20390 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
203a0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
203b0 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
203c0 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
203d0 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
203e0 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
203f0 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
20400 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
20410 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
20420 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
20430 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
20440 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
20450 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
20460 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
20470 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
20480 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
20490 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
204a0 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
204b0 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
204c0 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
204d0 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
204e0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
204f0 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
20500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20510 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
20520 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
20530 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
20540 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
20550 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
20560 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20570 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
20580 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20590 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
205a0 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
205b0 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
205c0 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
205d0 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
205e0 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
205f0 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
20600 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
20610 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
20620 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
20630 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
20640 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
20650 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
20660 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
20670 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
20680 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
20690 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
206a0 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
206b0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
206c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
206d0 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
206e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
206f0 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
20700 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
20710 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
20720 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
20730 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
20740 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
20750 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
20760 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
20770 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
20780 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
20790 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
207a0 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
207b0 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
207c0 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
207d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
207e0 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
207f0 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
20800 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
20810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20820 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20830 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
20840 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
20850 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
20860 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
20870 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
20880 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
20890 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
208b0 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
208c0 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
208d0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
208f0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
20900 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
20910 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
20920 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
20930 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
20940 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20950 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
20960 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20970 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
20980 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
20990 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
209a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
209b0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
209c0 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51  _NOENT ) rc = SQ
209d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
209e0 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  sWal = 0;.    }e
209f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20a00 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
20a10 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
20a20 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
20a30 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
20a40 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
20a50 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Wal.      );.   
20a60 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
20a70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20a80 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
20a90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20aa0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
20ab0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
20ac0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
20ad0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20ae0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
20af0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
20b00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
20b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
20b20 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
20b30 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
20b40 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20b50 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
20b60 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
20b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20b80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20b90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20ba0 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
20bb0 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
20bc0 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
20bd0 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
20be0 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
20bf0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
20c00 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
20c10 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
20c20 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
20c30 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
20c40 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
20c50 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
20c60 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
20c70 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
20c80 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
20c90 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
20ca0 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
20cb0 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
20cc0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
20cd0 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
20ce0 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
20cf0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
20d00 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
20d10 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
20d20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
20d30 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
20d40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
20d50 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
20d60 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
20d70 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20d80 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
20d90 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
20da0 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
20db0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20dc0 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
20dd0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20de0 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
20df0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20e00 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
20e10 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
20e20 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
20e30 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
20e40 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
20e50 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
20e60 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
20e70 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
20e80 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
20e90 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
20ea0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
20eb0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
20ec0 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
20ed0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20ee0 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
20ef0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20f00 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
20f10 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
20f20 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
20f30 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
20f40 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
20f50 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
20f60 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
20f70 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
20f80 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
20f90 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
20fa0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
20fb0 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
20fc0 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
20fd0 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
20fe0 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
20ff0 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
21000 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
21010 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
21020 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
21030 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
21040 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
21050 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
21060 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
21070 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
21080 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
21090 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
210a0 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
210b0 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
210c0 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
210d0 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
210e0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
210f0 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
21100 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
21110 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
21120 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
21130 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
21140 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
21150 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
21160 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
21170 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
21180 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
21190 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
211a0 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
211b0 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
211c0 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
211d0 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
211e0 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
211f0 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
21200 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
21210 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
21220 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
21230 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
21240 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
21250 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
21260 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
21270 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
21280 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
21290 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
212a0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
212b0 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
212c0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
212d0 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
212e0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
212f0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
21300 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
21310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
21320 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
21330 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
21340 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
21350 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21360 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
21370 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
21380 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
21390 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
213a0 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
213b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
213c0 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
213d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
213e0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
213f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21400 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
21410 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
21420 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
21430 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
21440 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
21450 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
21460 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
21470 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
21480 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
21490 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
214a0 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
214b0 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
214c0 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
214d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
214e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
214f0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
21500 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
21510 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
21520 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
21530 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
21540 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
21550 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
21560 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
21570 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
21580 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
21590 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
215a0 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
215b0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
215c0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
215d0 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
215e0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
215f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21600 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
21610 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
21620 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
21630 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
21640 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
21650 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
21660 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
21670 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
21680 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
21690 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
216a0 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
216b0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
216c0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
216d0 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
216e0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
216f0 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
21700 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
21710 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
21720 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
21730 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
21740 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
21750 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
21760 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
21770 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
21780 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
21790 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
217a0 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
217b0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
217c0 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
217d0 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
217e0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
217f0 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
21800 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
21810 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
21820 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
21830 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
21840 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
21850 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
21860 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
21870 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
21880 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
21890 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
218a0 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
218b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
218c0 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
218d0 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
218e0 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
218f0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
21900 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
21910 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21920 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
21930 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
21940 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
21950 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
21960 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
21970 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21980 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
21990 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
219a0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
219b0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
219c0 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
219d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
219e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
219f0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21a00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21a10 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
21a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21a30 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21a40 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
21a50 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21a60 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
21a70 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
21a80 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
21a90 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
21aa0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
21ab0 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
21ac0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
21ad0 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
21ae0 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
21af0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
21b00 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
21b10 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
21b20 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
21b30 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
21b40 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
21b50 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
21b60 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
21b70 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
21b80 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
21b90 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
21ba0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
21bb0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
21bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21bd0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21be0 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
21bf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21c00 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
21c10 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
21c20 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
21c30 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
21c40 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
21c50 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
21c60 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21c70 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
21c80 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
21c90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21ca0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21cb0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21cc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
21cd0 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
21ce0 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
21cf0 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
21d00 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
21d10 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
21d20 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
21d30 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
21d40 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
21d50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
21d60 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
21d70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21d80 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21d90 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21da0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
21db0 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
21dc0 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
21dd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21de0 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
21df0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
21e00 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
21e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21e20 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
21e30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
21e40 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
21e50 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21e60 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21e70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21e80 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21e90 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21ea0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21eb0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21ec0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
21ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
21ee0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21ef0 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
21f00 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
21f10 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
21f20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
21f30 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
21f40 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
21f50 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
21f60 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21f70 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
21f80 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
21f90 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
21fa0 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
21fb0 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
21fc0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
21fd0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
21fe0 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
21ff0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22000 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
22010 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
22020 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
22030 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
22040 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
22050 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
22060 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
22070 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
22080 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
22090 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
220a0 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
220b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
220c0 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
220d0 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
220e0 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
220f0 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
22100 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
22110 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
22120 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
22130 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
22140 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
22150 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
22160 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
22170 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
22180 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
22190 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
221a0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
221b0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
221c0 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
221d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
221e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
221f0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
22200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22210 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22220 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
22230 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
22240 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
22250 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
22260 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63  empting to recyc
22270 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75  le clean and unu
22280 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f  sed pages..*/.vo
22290 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
222a0 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
222b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
222c0 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
222d0 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
222e0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
222f0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
22300 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
22310 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
22320 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
22330 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
22340 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61  owed.** before a
22350 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69  ttempting to spi
22360 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72  ll pages to jour
22370 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
22380 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
22390 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
223a0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
223b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
223c0 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73  3PcacheSetSpills
223d0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
223e0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
223f0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51  ./*.** Invoke SQ
22400 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
22410 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68  SIZE based on th
22420 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
22430 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74  of szMmap..*/.st
22440 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
22450 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72  ixMaplimit(Pager
22460 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53   *pPager){.#if S
22470 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
22480 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f  IZE>0.  sqlite3_
22490 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
224a0 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f  r->fd;.  if( isO
224b0 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70  pen(fd) && fd->p
224c0 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
224d0 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  n>=3 ){.    sqli
224e0 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
224f0 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73    sz = pPager->s
22500 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65  zMmap;.    pPage
22510 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28  r->bUseFetch = (
22520 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74 47 65  sz>0);.    setGe
22530 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65  tterMethod(pPage
22540 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  r);.    sqlite3O
22550 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
22560 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
22570 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
22580 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23  IZE, &sz);.  }.#
22590 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
225a0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
225b0 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65  m size of any me
225c0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64  mory mapping mad
225d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
225e0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
225f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
22600 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  mapLimit(Pager *
22610 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f  pPager, sqlite3_
22620 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
22630 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
22640 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65  = szMmap;.  page
22650 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
22660 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ger);.}../*.** F
22670 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
22680 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
22690 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
226a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
226b0 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
226c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
226d0 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
226e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
226f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
22700 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68  t settings of th
22710 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65  e pager to those
22720 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
22730 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65  e pgFlags parame
22740 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ter..**.** The "
22750 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67  level" in pgFlag
22760 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
22770 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20  ONOUS_MASK sets 
22780 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a  the robustness.*
22790 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
227a0 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
227b0 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72  to OS crashes or
227c0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
227d0 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  by.** changing t
227e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
227f0 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
22800 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e  ng the journals.
22810 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f  .** There are fo
22820 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ur levels:.**.**
22830 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
22840 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
22850 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
22860 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
22870 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
22880 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
22890 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
228a0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
228b0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
228c0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
228d0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
228e0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
228f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22900 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
22910 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
22920 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
22930 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
22940 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
22950 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
22960 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
22970 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
22980 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
22990 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
229a0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
229b0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
229c0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
229d0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
229e0 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
229f0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
22a00 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
22a10 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
22a20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
22a30 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
22a40 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22a50 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
22a60 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
22a70 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
22a80 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22a90 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
22aa0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
22ab0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
22ac0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
22ad0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
22ae0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
22af0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
22b00 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
22b20 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
22b30 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
22b40 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
22b50 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
22b60 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
22b70 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
22b80 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
22b90 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
22ba0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
22bb0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
22bc0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
22bd0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22be0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
22bf0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
22c00 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
22c10 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ollback..**.**  
22c20 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69 73    EXTRA     This
22c30 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78   is like FULL ex
22c40 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c 73  cept that is als
22c50 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72 65  o syncs the dire
22c60 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  ctory.**        
22c70 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
22c80 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ins the rollback
22c90 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74   journal after t
22ca0 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20  he rollback.**  
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
22cc0 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e  nal is unlinked.
22cd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
22ce0 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
22cf0 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
22d00 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
22d10 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
22d20 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
22d30 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
22d40 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
22d50 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
22d60 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
22d70 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
22d80 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
22d90 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
22da0 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
22db0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
22dc0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
22dd0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
22de0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
22df0 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
22e00 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
22e10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
22e20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
22e30 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
22e40 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
22e50 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
22e60 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
22e70 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
22e80 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
22e90 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
22ea0 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
22eb0 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
22ec0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
22ed0 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
22ee0 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
22ef0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
22f00 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
22f10 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54   FULL.** and EXT
22f20 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e  RA for WAL mode.
22f30 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
22f40 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
22f50 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
22f60 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
22f70 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
22f80 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
22f90 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
22fa0 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
22fb0 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
22fc0 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
22fd0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
22fe0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
22ff0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
23000 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
23010 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
23020 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
23030 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23040 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
23050 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
23060 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
23070 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
23080 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
23090 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
230a0 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
230b0 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
230c0 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
230d0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
230e0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
230f0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
23100 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
23110 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
23120 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
23130 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
23140 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
23150 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
23160 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
23170 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
23180 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
23190 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
231a0 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  gs(.  Pager *pPa
231b0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
231c0 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20  he pager to set 
231d0 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72  safety level for
231e0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
231f0 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56  gFlags      /* V
23200 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
23210 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65  ){.  unsigned le
23220 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20  vel = pgFlags & 
23230 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
23240 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50  S_MASK;.  if( pP
23250 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
23260 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
23270 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
23280 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
23290 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
232a0 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
232b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
232c0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
232d0 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
232e0 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b  RONOUS_OFF ?1:0;
232f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
23300 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50  lSync = level>=P
23310 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
23320 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20  _FULL ?1:0;.    
23330 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
23340 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52  c = level==PAGER
23350 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54  _SYNCHRONOUS_EXT
23360 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69  RA ?1:0;.  }.  i
23370 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
23380 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
23390 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
233a0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
233b0 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
233c0 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
233d0 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
233e0 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
233f0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
23400 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23410 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
23420 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
23430 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
23440 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
23450 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
23460 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
23470 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23480 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23490 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
234a0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
234b0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
234c0 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
234d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
234e0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
234f0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
23500 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
23510 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23520 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
23530 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
23540 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
23550 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
23560 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
23570 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
23580 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
23590 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
235a0 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
235b0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
235c0 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
235d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
235e0 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
235f0 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
23600 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23610 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
23620 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
23630 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
23640 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23650 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
23660 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
23670 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
23680 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
23690 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
236a0 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
236b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
236c0 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
236d0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
236e0 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
236f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
23700 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
23710 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
23720 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
23730 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23740 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
23750 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
23760 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
23770 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23780 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
23790 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
237a0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
237b0 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
237c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
237d0 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
237e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
237f0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
23800 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
23810 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
23820 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
23830 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
23840 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
23850 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
23860 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
23870 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
23880 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23890 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
238a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
238b0 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
238c0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
238d0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
238e0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
238f0 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
23900 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
23910 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
23920 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23930 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
23940 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
23950 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
23960 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
23970 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
23980 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
23990 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
239a0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
239b0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
239c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
239d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
239e0 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
239f0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
23a00 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
23a10 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
23a20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
23a30 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
23a40 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
23a50 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
23a60 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
23a70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
23a80 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
23a90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
23aa0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
23ab0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23ac0 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
23ad0 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
23ae0 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
23af0 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
23b00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
23b10 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
23b20 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
23b30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23b40 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
23b50 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
23b60 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
23b70 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
23b80 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
23b90 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
23ba0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
23bb0 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
23bc0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
23bd0 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
23be0 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
23bf0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
23c00 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
23c10 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
23c20 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
23c30 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
23c40 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
23c50 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
23c60 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
23c70 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
23c80 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
23c90 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
23ca0 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
23cb0 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
23cc0 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
23cd0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
23ce0 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
23cf0 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
23d20 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
23d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d60 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
23d70 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
23d80 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
23d90 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
23da0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
23db0 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
23dc0 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
23dd0 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
23de0 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
23df0 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
23e00 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
23e10 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
23e20 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
23e30 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
23e40 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
23e50 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
23e60 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
23e70 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
23e80 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
23e90 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
23ea0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
23eb0 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
23ec0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
23ed0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23ee0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
23ef0 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
23f00 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
23f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23f20 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
23f30 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
23f40 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
23f50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
23f60 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
23f70 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
23f80 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
23f90 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
23fa0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
23fb0 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
23fc0 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
23fd0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23fe0 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
23ff0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
24000 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
24010 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
24020 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
24030 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
24040 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
24050 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
24060 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
24070 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
24080 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
24090 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
240a0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
240b0 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
240c0 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
240d0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
240e0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
240f0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
24100 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
24110 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
24120 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
24130 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
24140 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
24150 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
24160 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
24170 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
24180 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
24190 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
241a0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
241b0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
241c0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
241d0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
241e0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
241f0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
24200 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
24210 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
24220 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
24230 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
24240 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
24250 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
24260 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
24270 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
24280 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
24290 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
242a0 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
242b0 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
242c0 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
242d0 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
242e0 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
242f0 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
24300 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
24310 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
24320 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
24330 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
24340 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
24350 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
24360 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
24370 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
24380 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
24390 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
243a0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
243b0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
243c0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
243d0 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
243e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
243f0 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
24400 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
24410 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
24420 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
24430 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
24440 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
24450 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
24460 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
24470 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
24480 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
24490 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
244a0 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
244b0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
244c0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
244d0 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
244e0 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
244f0 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
24500 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
24510 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
24520 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24530 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
24540 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
24550 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
24560 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
24570 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
24580 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
24590 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
245a0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
245b0 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
245c0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
245d0 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
245e0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
245f0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
24600 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
24610 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
24620 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
24630 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
24640 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
24650 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24660 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
24670 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
24680 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
24690 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
246a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
246b0 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
246c0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
246d0 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
246e0 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
246f0 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
24700 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
24710 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
24720 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
24730 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
24740 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
24750 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
24760 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
24770 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
24780 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
24790 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
247a0 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
247b0 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
247c0 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
247d0 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
247e0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
247f0 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
24800 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
24810 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
24820 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
24830 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
24840 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
24850 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
24860 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
24870 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
24880 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
24890 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
248a0 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
248b0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
248c0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
248d0 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
248e0 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
248f0 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
24900 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
24910 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
24920 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
24930 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
24940 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
24950 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
24960 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
24970 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
24980 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
24990 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
249a0 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
249b0 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
249c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
249d0 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
249e0 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
249f0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24a10 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
24a20 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
24a30 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24a50 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
24a60 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
24a70 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
24a80 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
24a90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24aa0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  EM_BKPT;.    }..
24ab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
24ad0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
24ae0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
24af0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
24b00 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
24b10 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
24b20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
24b30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24b40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24b50 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
24b60 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
24b70 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
24b80 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
24b90 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
24ba0 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74  e = (Pgno)((nByt
24bb0 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61  e+pageSize-1)/pa
24bc0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
24bd0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
24be0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
24bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
24c00 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65  ite3PageFree(pNe
24c10 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
24c20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
24c30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
24c40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
24c60 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73  Reserve<0 ) nRes
24c70 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  erve = pPager->n
24c80 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
24c90 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
24ca0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30   && nReserve<100
24cb0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
24cc0 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36  >nReserve = (i16
24cd0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  )nReserve;.    p
24ce0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
24cf0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
24d00 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
24d10 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
24d20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24d30 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24d40 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
24d50 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
24d60 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
24d70 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
24d80 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
24d90 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
24da0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
24db0 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
24dc0 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
24dd0 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
24de0 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
24df0 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
24e00 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
24e10 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
24e20 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
24e30 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
24e40 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
24e50 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
24e60 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
24e70 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
24e80 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
24e90 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
24ea0 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
24eb0 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
24ec0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
24ed0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
24ee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
24ef0 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
24f00 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
24f10 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
24f20 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
24f30 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
24f40 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
24f50 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
24f60 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
24f70 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
24f80 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
24f90 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
24fa0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
24fb0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
24fc0 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
24fd0 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
24fe0 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
24ff0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
25000 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
25010 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
25020 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
25030 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
25040 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
25050 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
25060 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Page;.  }.  asse
25070 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25080 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
25090 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64  ;      /* Called
250a0 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50   only by OP_MaxP
250b0 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74  gcnt */.  assert
250c0 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
250d0 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  >=pPager->dbSize
250e0 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67   );  /* OP_MaxPg
250f0 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69  cnt enforces thi
25100 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50  s */.  return pP
25110 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
25120 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
25130 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
25140 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
25150 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
25160 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
25170 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
25180 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
25190 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
251a0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
251b0 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
251c0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
251d0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
251e0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
251f0 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
25200 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
25210 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
25220 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
25230 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
25240 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
25250 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
25260 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
25270 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
25280 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
25290 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
252a0 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
252b0 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
252c0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
252d0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
252e0 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
252f0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
25300 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
25310 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
25320 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
25330 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
25340 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
25350 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25360 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
25370 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
25380 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
25390 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
253a0 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
253b0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
253c0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
253d0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
253e0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
253f0 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
25400 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
25410 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
25420 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
25430 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
25440 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
25450 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
25460 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
25470 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
25480 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
25490 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
254a0 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
254b0 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
254c0 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
254d0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
254e0 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
254f0 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
25500 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
25510 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
25520 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
25530 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
25540 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
25550 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
25560 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
25570 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
25580 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
25590 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
255a0 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
255b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
255c0 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
255d0 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
255e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
255f0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
25600 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
25610 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
25620 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
25630 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
25640 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
25650 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
25660 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
25670 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
25680 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
25690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
256a0 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
256b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
256c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
256d0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
256e0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ile );..  /* Thi
256f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
25700 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65  y called by btre
25710 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  e immediately af
25720 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  ter creating.  *
25730 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  * the Pager obje
25740 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e  ct.  There has n
25750 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72  ot been an oppor
25760 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69  tunity to transi
25770 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c  tion.  ** to WAL
25780 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a   mode yet..  */.
25790 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
257a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
257b0 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
257c0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
257d0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
257e0 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
257f0 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
25800 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
25810 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
25820 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
25830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
25840 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
25850 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
25860 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
25870 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25880 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
25890 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
258a0 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
258b0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
258c0 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20  n is open on.** 
258d0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65  the pager. It re
258e0 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
258f0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
25900 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
25910 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  .**.** However, 
25920 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
25930 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
25940 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
25950 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
25960 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
25970 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
25980 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
25990 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
259a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
259b0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
259c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
259d0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
259e0 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
259f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25a00 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  !=PAGER_WRITER_F
25a10 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e  INISHED );.  *pn
25a20 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67  Page = (int)pPag
25a30 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a  er->dbSize;.}...
25a40 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
25a50 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
25a60 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74  pe locktype on t
25a70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25a80 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61  . If.** a simila
25a90 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  r or greater loc
25aa0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
25ab0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
25ac0 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28   is a no-op.** (
25ad0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
25ae0 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29  _OK immediately)
25af0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
25b00 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  e, attempt to ob
25b10 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73  tain the lock us
25b20 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  ing sqlite3OsLoc
25b30 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20  k(). Invoke .** 
25b40 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
25b50 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  k if the lock is
25b60 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
25b70 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74  vailable. Repeat
25b80 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62   .** until the b
25b90 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
25ba0 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e  urns false or un
25bb0 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20  til the attempt 
25bc0 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68  to .** obtain th
25bd0 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
25be0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
25bf0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
25c00 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
25c10 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
25c20 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
25c30 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
25c40 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75  k is obtained su
25c50 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20  ccessfully, set 
25c60 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20  the Pager.state 
25c70 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20  .** variable to 
25c80 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20  locktype before 
25c90 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
25ca0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
25cb0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
25cc0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
25cd0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
25ce0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d00 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
25d10 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
25d20 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
25d30 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
25d40 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
25d50 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
25d60 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f  already held), o
25d70 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
25d80 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68  nsitions that th
25d90 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
25da0 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
25db0 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
25dc0 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
25dd0 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
25de0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
25df0 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
25e00 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
25e10 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b  ger->eLock>=lock
25e20 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
25e30 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
25e40 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  NO_LOCK && lockt
25e50 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
25e60 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
25e70 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45  ger->eLock==RESE
25e80 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  RVED_LOCK && loc
25e90 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
25ea0 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64  _LOCK).  );..  d
25eb0 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  o {.    rc = pag
25ec0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
25ed0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77   locktype);.  }w
25ee0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
25ef0 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
25f00 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
25f10 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
25f20 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75  erArg) );.  retu
25f30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25f40 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
25f50 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25f60 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
25f70 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
25f80 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
25f90 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
25fa0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
25fb0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
25fc0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
25fd0 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
25fe0 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
25ff0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
26000 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
26010 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
26020 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
26030 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
26040 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
26050 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
26060 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
26070 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
26080 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
26090 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
260a0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
260b0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
260c0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
260d0 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
260e0 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
260f0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
26100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
26110 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
26120 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
26130 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
26140 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
26150 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
26160 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
26170 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
26180 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
26190 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
261a0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
261b0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
261c0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
261d0 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
261e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
261f0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
26200 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
26210 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
26220 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
26230 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
26240 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20  havior would be 
26250 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
26260 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
26270 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
26280 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
26290 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
262a0 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
262b0 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
262c0 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
262d0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
262e0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
262f0 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
26300 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
26310 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
26320 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
26330 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
26340 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
26350 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
26360 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
26370 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
26380 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
26390 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
263a0 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
263b0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
263c0 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
263d0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
263e0 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
263f0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
26400 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
26410 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
26420 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
26430 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
26440 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
26450 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
26460 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
26470 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26480 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
26490 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
264a0 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
264b0 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
264c0 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
264d0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
264e0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
264f0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
26500 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
26510 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
26520 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
26530 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
26540 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
26550 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
26560 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
26570 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
26580 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
26590 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
265a0 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
265b0 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
265c0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
265d0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
265e0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
265f0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
26600 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
26610 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
26620 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
26630 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26640 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
26650 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
26660 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
26670 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74  ction..** Once t
26680 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
26690 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
266a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
266b0 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20  st either be.** 
266c0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63  rolled back or c
266d0 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20  ommitted. It is 
266e0 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c  not safe to call
266f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
26700 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69  nd.** then conti
26710 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  nue writing to t
26720 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
26730 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
26740 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
26750 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
26760 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
26770 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
26780 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
26790 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
267a0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
267b0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
267c0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
267d0 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a  e = nPage;..  /*
267e0 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
267f0 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c  e code here call
26800 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ed assertTruncat
26810 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f  eConstraint() to
26820 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61  .  ** ensure tha
26830 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e  t all pages bein
26840 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79  g truncated away
26850 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
26860 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20  on are,.  ** if 
26870 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
26880 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c  points are open,
26890 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
268a0 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
268b0 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
268c0 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
268d0 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65  ored if the save
268e0 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a  point is rolled.
268f0 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20    ** back. This 
26900 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63  is no longer nec
26910 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66  essary as this f
26920 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f  unction is now o
26930 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20  nly.  ** called 
26940 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
26950 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
26960 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75  ction. So althou
26970 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  gh the .  ** Pag
26980 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74  er object may st
26990 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61  ill have open sa
269a0 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e  vepoints (Pager.
269b0 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20  nSavepoint!=0), 
269c0 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f  .  ** they canno
269d0 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
269e0 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54  . So the assertT
269f0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26a00 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73  t() call.  ** is
26a10 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65   no longer corre
26a20 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ct. */.}.../*.**
26a30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26a40 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
26a50 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
26a60 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
26a70 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
26a80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26a90 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
26aa0 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
26ab0 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
26ac0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
26ad0 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
26ae0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
26af0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
26b00 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
26b10 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
26b20 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
26b30 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
26b40 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
26b50 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
26b60 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
26b70 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
26b80 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
26b90 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
26ba0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
26bb0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
26bc0 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
26bd0 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
26be0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
26bf0 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
26c00 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
26c10 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
26c20 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
26c30 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
26c40 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
26c50 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
26c60 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
26c70 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
26c80 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
26c90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26ca0 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
26cb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26cc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26cd0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
26ce0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
26cf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26d00 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
26d10 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
26d20 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
26d30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26d40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
26d50 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
26d60 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
26d70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
26d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26d90 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
26da0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
26db0 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
26dc0 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
26dd0 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26de0 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
26df0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
26e00 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
26e10 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
26e20 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
26e30 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
26e40 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
26e50 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
26e60 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
26e70 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
26e80 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
26e90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
26ea0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
26eb0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
26ec0 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
26ed0 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
26ee0 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
26ef0 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
26f00 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
26f10 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
26f20 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
26f30 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
26f40 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
26f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26f60 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
26f70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
26f80 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
26f90 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
26fa0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
26fb0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26fd0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
26fe0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27000 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
27010 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
27020 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
27030 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
27040 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
27050 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
27060 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
27070 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
27080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
27090 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
270a0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
270b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
270c0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
270d0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
270e0 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
270f0 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
27100 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27110 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
27120 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
27130 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
27140 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 3d 38  Pager->nExtra>=8
27150 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
27160 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 38 29 3b  ->pExtra, 0, 8);
27170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
27180 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48  pPage = p = (PgH
27190 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  dr *)sqlite3Mall
271a0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
271b0 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Hdr) + pPager->n
271c0 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20  Extra);.    if( 
271d0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
271e0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
271f0 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
27200 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
27210 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
27220 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
27230 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
27240 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
27250 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64  ->pExtra = (void
27260 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d   *)&p[1];.    p-
27270 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d  >flags = PGHDR_M
27280 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  MAP;.    p->nRef
27290 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61   = 1;.    p->pPa
272a0 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
272b0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  }..  assert( p->
272c0 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29  pExtra==(void *)
272d0 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72  &p[1] );.  asser
272e0 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29  t( p->pPage==0 )
272f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66  ;.  assert( p->f
27300 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50  lags==PGHDR_MMAP
27310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
27320 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
27330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27340 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d  nRef==1 );..  p-
27350 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
27360 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61  p->pData = pData
27370 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
27380 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72  pOut++;..  retur
27390 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
273a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
273b0 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
273c0 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50   to page pPg. pP
273d0 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
273e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
273f0 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  .** earlier call
27400 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65   to pagerAcquire
27410 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
27420 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
27430 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67  eleaseMapPage(Pg
27440 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
27450 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
27460 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67  ->pPager;.  pPag
27470 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a  er->nMmapOut--;.
27480 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
27490 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
274a0 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  elist;.  pPager-
274b0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
274c0 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28   pPg;..  assert(
274d0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
274e0 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
274f0 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  =3 );.  sqlite3O
27500 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
27510 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e  >fd, (i64)(pPg->
27520 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
27530 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70  pageSize, pPg->p
27540 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
27550 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f  Free all PgHdr o
27560 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e  bjects stored in
27570 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70   the Pager.pMmap
27580 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a  Freelist list..*
27590 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
275a0 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50  gerFreeMapHdrs(P
275b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
275c0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48   PgHdr *p;.  PgH
275d0 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  dr *pNext;.  for
275e0 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  (p=pPager->pMmap
275f0 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70  Freelist; p; p=p
27600 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
27610 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
27620 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27630 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
27640 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
27650 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
27660 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
27670 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
27680 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
27690 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
276a0 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
276b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
276c0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
276d0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
276e0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
276f0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
27700 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
27710 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
27720 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
27730 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
27740 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
27750 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
27760 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
27770 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
27780 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
27790 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
277a0 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
277b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
277c0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
277d0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
277e0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
277f0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
27800 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
27810 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
27820 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
27830 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
27840 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
27850 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
27860 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
27870 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
27880 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
27890 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
278a0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
278b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
278c0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20  ite3 *db){.  u8 
278d0 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
278e0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
278f0 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c  ..  assert( db |
27900 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
27910 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
27920 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
27930 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
27940 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
27950 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
27960 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
27970 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
27980 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61  );.  pagerFreeMa
27990 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20  pHdrs(pPager);. 
279a0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43   /* pPager->errC
279b0 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ode = 0; */.  pP
279c0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
279d0 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
279e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
279f0 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c  .  assert( db ||
27a00 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
27a10 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
27a20 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
27a30 61 6c 2c 20 64 62 2c 20 70 50 61 67 65 72 2d 3e  al, db, pPager->
27a40 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70  ckptSyncFlags, p
27a50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
27a60 0a 20 20 20 20 20 20 28 64 62 20 26 26 20 28 64  .      (db && (d
27a70 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
27a80 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 29  E_NoCkptOnClose)
27a90 20 3f 20 30 20 3a 20 70 54 6d 70 29 0a 20 20 29   ? 0 : pTmp).  )
27aa0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
27ab0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
27ac0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
27ad0 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
27ae0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
27af0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
27b00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
27b10 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63  it is open, sync
27b20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27b30 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
27b40 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
27b50 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  ck..    ** If th
27b60 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20  is is not done, 
27b70 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64  then an unsynced
27b80 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
27b90 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  open journal .  
27ba0 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65    ** file may be
27bb0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
27bc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
27bd0 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
27be0 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a  re occurs .    *
27bf0 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  * while this is 
27c00 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
27c10 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
27c20 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
27c30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
27c40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
27c50 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
27c60 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ync the journal,
27c70 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72   shift the pager
27c80 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
27c90 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68   ERROR state. Th
27ca0 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b  is causes Unlock
27cb0 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75  AndRollback to u
27cc0 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a  nlock the.    **
27cd0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
27ce0 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
27cf0 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74  file without att
27d00 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
27d10 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f  it.    ** back o
27d20 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54  r finalize it. T
27d30 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65  he next database
27d40 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20   user will have 
27d50 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  to do hot-journa
27d60 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  l.    ** rollbac
27d70 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69  k before accessi
27d80 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
27d90 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
27da0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
27db0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
27dc0 20 20 69 66 28 20 70 61 67 65 72 49 73 53 65 72    if( pagerIsSer
27dd0 76 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a 20  ver(pPager) ){. 
27de0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
27df0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
27e00 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
27e10 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 29 3b  LMODE_PERSIST );
27e20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
27e30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
27e40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
27e50 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  _DELETE;.       
27e60 20 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79   /* If necessary
27e70 2c 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  , change the pag
27e80 65 72 20 73 74 61 74 65 20 73 6f 20 74 68 61 74  er state so that
27e90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27ea0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  e .        ** is
27eb0 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
27ec0 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 55 6e 6c  call to pagerUnl
27ed0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29  ockAndRollback()
27ee0 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
27ef0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
27f00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
27f10 45 4e 20 29 20 70 50 61 67 65 72 2d 3e 65 53 74  EN ) pPager->eSt
27f20 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
27f30 45 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ER;.      }.    
27f40 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
27f50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48  ager, pagerSyncH
27f60 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
27f70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
27f80 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
27f90 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
27fa0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
27fb0 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20  SERVER_EDITION. 
27fc0 20 69 66 28 20 70 61 67 65 72 49 73 53 65 72 76   if( pagerIsServ
27fd0 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  er(pPager) ){.  
27fe0 20 20 73 71 6c 69 74 65 33 53 65 72 76 65 72 44    sqlite3ServerD
27ff0 69 73 63 6f 6e 6e 65 63 74 28 70 50 61 67 65 72  isconnect(pPager
28000 2d 3e 70 53 65 72 76 65 72 2c 20 70 50 61 67 65  ->pServer, pPage
28010 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61 67  r->fd);.    pPag
28020 65 72 2d 3e 70 53 65 72 76 65 72 20 3d 20 30 3b  er->pServer = 0;
28030 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28040 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
28050 61 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  al);.  }.#endif.
28060 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
28070 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
28080 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
28090 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
280a0 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
280b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
280c0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
280d0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
280e0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
280f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
28100 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
28110 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
28120 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
28130 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
28140 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
28150 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
28160 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
28170 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
28180 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
28190 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
281a0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
281b0 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
281c0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
281d0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
281e0 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
281f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
28200 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
28210 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28220 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
28230 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
28240 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
28250 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
28260 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
28270 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
28280 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
28290 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
282a0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
282b0 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
282c0 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
282d0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
282e0 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
282f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
28300 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
28310 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
28320 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
28330 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
28340 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28350 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
28360 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
28370 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
28380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
28390 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
283a0 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
283b0 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
283c0 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
283d0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
283e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
283f0 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
28400 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
28410 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
28420 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
28430 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
28440 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
28450 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
28460 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
28470 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
28480 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
28490 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
284a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
284b0 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
284c0 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
284d0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
284e0 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
284f0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
28500 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
28510 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
28520 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
28530 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
28540 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
28550 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
28560 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
28570 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
28580 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
28590 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
285a0 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
285b0 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
285c0 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
285d0 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
285e0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
285f0 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
28600 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
28610 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
28620 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
28630 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
28640 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
28650 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
28660 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
28670 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
28680 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
28690 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
286a0 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
286b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
286c0 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
286d0 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
286e0 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
286f0 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
28700 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
28710 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
28720 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
28730 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
28740 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
28750 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
28760 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
28770 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
28780 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
28790 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
287a0 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
287b0 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
287c0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
287d0 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
287e0 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
287f0 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
28800 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
28810 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
28820 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
28830 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
28840 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49  ;.**   }.**.** I
28850 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
28860 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
28870 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
28880 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
28890 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
288a0 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
288b0 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
288c0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
288d0 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
288e0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
288f0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
28900 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
28910 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
28920 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
28930 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
28940 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
28950 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e  nt newHdr){.  in
28960 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28980 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
28990 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
289a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
289b0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
289c0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
289d0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
289e0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
289f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
28a00 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
28a10 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
28a20 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
28a30 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
28a40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28a50 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
28a60 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
28a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28a80 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
28a90 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
28aa0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
28ab0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
28ac0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
28ad0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28ae0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
28af0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
28b00 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
28b10 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
28b20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
28b30 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
28b40 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
28b50 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
28b60 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
28b70 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
28b80 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
28b90 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
28ba0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
28bb0 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
28bc0 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
28bd0 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
28be0 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
28bf0 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
28c00 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
28c10 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
28c20 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
28c30 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
28c40 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
28c50 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
28c60 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
28c70 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
28c80 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
28c90 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
28ca0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
28cb0 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
28cc0 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
28cd0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
28ce0 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
28cf0 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
28d00 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
28d10 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
28d20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
28d30 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
28d40 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
28d50 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
28d60 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
28d70 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
28d80 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
28d90 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
28da0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
28db0 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
28dc0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
28dd0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28de0 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
28df0 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
28e00 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
28e10 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
28e20 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
28e30 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
28e40 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
28e50 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
28e60 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
28e70 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
28e80 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
28e90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
28ea0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
28eb0 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
28ec0 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
28ed0 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
28ee0 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
28ef0 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
28f00 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
28f10 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
28f20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28f30 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
28f40 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
28f50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
28f60 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
28f70 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
28f80 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
28f90 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
28fa0 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
28fb0 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
28fc0 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
28fd0 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
28fe0 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
28ff0 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
29000 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
29010 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
29020 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
29030 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
29040 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
29050 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
29060 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
29070 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
29080 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
29090 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
290a0 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
290b0 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
290c0 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
290d0 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
290e0 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
290f0 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
29100 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
29110 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29120 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
29130 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
29140 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
29150 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
29160 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
29170 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
29180 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
29190 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
291a0 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
291b0 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
291c0 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
291d0 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
291e0 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
291f0 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
29200 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
29210 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
29220 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
29230 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29240 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
29250 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
29260 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
29270 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29280 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29290 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
292a0 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
292b0 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
292c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
292d0 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
292e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
292f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
29300 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
29310 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
29320 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
29330 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
29340 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
29350 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
29360 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
29370 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
29380 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
29390 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
293a0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
293b0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
293c0 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
293d0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
293e0 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
293f0 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
29400 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
29410 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
29420 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
29430 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
29440 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
29450 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
29460 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
29470 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
29480 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
29490 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
294a0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
294b0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
294c0 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
294d0 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
294e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
294f0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
29500 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
29510 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
29520 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
29530 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
29540 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
29550 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
29560 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
29570 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
29580 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
29590 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
295a0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
295b0 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
295c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
295d0 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
295e0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
295f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
29600 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
29610 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
29620 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
29630 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
29640 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
29650 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
29660 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29670 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
29680 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
29690 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
296a0 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
296b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
296c0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
296d0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
296e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
296f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
29720 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
29730 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
29740 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29750 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
29760 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
29770 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
29780 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
29790 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
297a0 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
297b0 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
297c0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
297d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
297e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
297f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
29800 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
29810 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
29820 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
29830 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
29840 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
29850 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
29860 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
29870 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
29880 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
29890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
298a0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
298b0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
298c0 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
298d0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
298e0 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
298f0 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
29900 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
29910 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
29920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29930 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29940 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61      }..      pPa
29950 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
29960 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
29970 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  lOff;.      if( 
29980 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44  newHdr && 0==(iD
29990 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
299a0 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
299b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
299c0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
299d0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
299e0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
299f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29a00 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29a10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
29a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
29a30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
29a40 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
29a50 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
29a60 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74  }..  /* Unless t
29a70 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
29a80 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  oSync mode, the 
29a90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
29aa0 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63   just .  ** succ
29ab0 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
29ac0 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65   Either way, cle
29ad0 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
29ae0 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a  D_SYNC flag on .
29af0 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a    ** all pages..
29b00 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
29b10 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
29b20 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
29b30 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  he);.  pPager->e
29b40 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
29b50 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73  ITER_DBMOD;.  as
29b60 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
29b70 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
29b80 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
29b90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
29ba0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
29bb0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
29bc0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
29bd0 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
29be0 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
29bf0 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
29c00 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
29c10 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
29c20 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
29c30 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
29c40 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
29c50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
29c60 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
29c70 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
29c80 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
29c90 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
29ca0 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
29cb0 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
29cc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
29cd0 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
29ce0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
29cf0 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
29d00 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
29d10 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
29d20 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
29d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29d40 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
29d50 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
29d60 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
29d70 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
29d80 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
29d90 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
29da0 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
29db0 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
29dc0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
29dd0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
29de0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
29df0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
29e00 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
29e10 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
29e20 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
29e30 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
29e40 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
29e50 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
29e60 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
29e70 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
29e80 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
29e90 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
29ea0 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
29eb0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
29ec0 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
29ed0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
29ee0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29ef0 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
29f00 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
29f10 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
29f20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
29f30 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
29f40 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
29f50 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
29f60 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
29f70 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
29f80 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
29f90 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
29fa0 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
29fb0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
29fc0 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
29fd0 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
29fe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29ff0 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
2a000 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
2a010 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
2a020 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
2a030 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
2a040 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
2a050 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
2a060 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
2a070 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
2a080 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
2a090 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
2a0a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2a0b0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
2a0c0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2a0d0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
2a0e0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2a0f0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
2a100 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
2a110 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2a120 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
2a130 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
2a140 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
2a150 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
2a160 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2a170 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2a180 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2a190 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
2a1a0 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
2a1b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a1c0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2a1d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2a1e0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
2a1f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
2a200 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f  ly called for ro
2a210 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e  llback pagers in
2a220 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74   WRITER_DBMOD st
2a230 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ate. */.  assert
2a240 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2a250 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
2a260 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
2a270 46 69 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  File || pPager->
2a280 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2a290 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20  ITER_DBMOD );.  
2a2a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a2b0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
2a2c0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2a2d0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2a2e0 2d 3e 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e  ->fd) || pList->
2a2f0 70 44 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  pDirty==0 );..  
2a300 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
2a310 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
2a320 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
2a330 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
2a340 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
2a350 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2a360 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
2a370 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
2a380 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
2a390 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
2a3a0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2a3b0 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
2a3c0 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
2a3d0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
2a3e0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
2a3f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a400 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
2a410 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a420 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
2a430 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
2a440 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
2a450 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
2a460 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
2a470 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65   the first write
2a480 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61  , give the VFS a
2a490 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68   hint of what th
2a4a0 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  e final.  ** fil
2a4b0 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a  e size will be..
2a4c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72    */.  assert( r
2a4d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2a4e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2a4f0 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  d) );.  if( rc==
2a500 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
2a510 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
2a520 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
2a530 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d  ze.   && (pList-
2a540 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74  >pDirty || pList
2a550 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2a560 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a  bHintSize).  ){.
2a570 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2a580 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65  4 szFile = pPage
2a590 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  r->pageSize * (s
2a5a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61  qlite3_int64)pPa
2a5b0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2a5c0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
2a5d0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
2a5e0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
2a5f0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
2a600 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67  zFile);.    pPag
2a610 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
2a620 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
2a630 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
2a640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a650 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
2a660 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
2a670 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
2a680 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
2a690 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
2a6a0 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
2a6b0 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
2a6c0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
2a6d0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
2a6e0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
2a6f0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
2a700 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
2a710 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
2a720 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
2a730 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
2a740 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
2a750 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
2a760 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
2a770 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
2a780 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
2a790 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
2a7a0 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
2a7b0 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
2a7c0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
2a7d0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
2a7e0 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
2a7f0 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
2a800 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
2a810 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
2a820 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
2a830 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
2a840 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
2a850 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
2a860 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
2a870 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
2a880 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
2a890 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
2a8a0 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a8d0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
2a8e0 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72     ..      asser
2a8f0 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  t( (pList->flags
2a900 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2a910 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
2a920 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
2a930 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
2a940 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
2a950 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  st);..      /* E
2a960 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
2a970 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
2a980 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
2a990 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
2a9a0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2a9b0 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74  NOMEM_BKPT, pDat
2a9c0 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
2a9d0 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
2a9e0 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
2a9f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2aa00 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
2aa10 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
2aa20 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
2aa30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
2aa40 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
2aa50 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
2aa60 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
2aa70 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
2aa80 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
2aa90 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
2aaa0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
2aab0 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
2aac0 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
2aad0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
2aae0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
2aaf0 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
2ab00 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2ab10 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
2ab20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2ab30 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2ab40 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
2ab50 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
2ab60 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
2ab70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2ab80 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
2ab90 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
2aba0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
2abb0 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
2abc0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
2abd0 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
2abe0 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20  TAT_WRITE]++;.. 
2abf0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
2ac00 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
2ac10 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
2ac20 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
2ac30 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
2ac40 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
2ac50 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
2ac60 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
2ac70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
2ac80 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2ac90 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
2aca0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
2acb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2acc0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2acd0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
2ace0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
2acf0 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
2ad00 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
2ad10 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
2ad20 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
2ad30 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
2ad40 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2ad50 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
2ad60 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2ad70 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
2ad80 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2ad90 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
2ada0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
2adb0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
2adc0 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74  List);.    pList
2add0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2ade0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2adf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73  rc;.}../*.** Ens
2ae00 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62  ure that the sub
2ae10 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2ae20 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20   open. If it is 
2ae30 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
2ae40 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
2ae50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
2ae60 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2ae70 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
2ae80 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
2ae90 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e  ding to plan. An
2aea0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
2aeb0 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
2aec0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2aed0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
2aee0 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61  3OsOpen() .** fa
2aef0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2af00 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
2af10 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
2af20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2af30 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69  ITE_OK;.  if( !i
2af40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2af50 66 64 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  fd) ){.    const
2af60 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51   int flags =  SQ
2af70 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
2af80 52 4e 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RNAL | SQLITE_OP
2af90 45 4e 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20  EN_READWRITE .  
2afa0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
2afb0 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
2afc0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
2afd0 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45   .      | SQLITE
2afe0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2aff0 4f 53 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  OSE;.    int nSt
2b000 6d 74 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65  mtSpill = sqlite
2b010 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69  3Config.nStmtSpi
2b020 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ll;.    if( pPag
2b030 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2b040 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2b050 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
2b060 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
2b070 79 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74  y ){.      nStmt
2b080 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  Spill = -1;.    
2b090 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
2b0a0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  e3JournalOpen(pP
2b0b0 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
2b0c0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61  Pager->sjfd, fla
2b0d0 67 73 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b  gs, nStmtSpill);
2b0e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b0f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
2b100 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
2b110 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
2b120 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
2b130 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
2b140 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2b150 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69  sful, set the bi
2b160 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
2b170 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  to pPg->pgno in 
2b180 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66  the bitvecs.** f
2b190 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  or all open save
2b1a0 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65  points before re
2b1b0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
2b1c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2b1d0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
2b1e0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2b1f0 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49  successful, an I
2b200 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  O.** error code 
2b210 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
2b220 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73  o write to the s
2b230 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  ub-journal fails
2b240 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  , or .** SQLITE_
2b250 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
2b260 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65  c fails while se
2b270 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61  tting a bit in a
2b280 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69   savepoint.** bi
2b290 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tvec..*/.static 
2b2a0 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
2b2b0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
2b2c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b2d0 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
2b2e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2b2f0 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ger;.  if( pPage
2b300 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2b310 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2b320 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a  E_OFF ){..    /*
2b330 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
2b340 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73  urnal, if it has
2b350 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
2b360 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  n opened */.    
2b370 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2b380 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2b390 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2b3a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
2b3b0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2b3c0 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ger) );.    asse
2b3d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2b3e0 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67  r->sjfd) || pPag
2b3f0 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29  er->nSubRec==0 )
2b400 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
2b410 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2b420 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2b430 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61  ageInJournal(pPa
2b440 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20  ger, pPg) .     
2b450 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
2b460 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
2b470 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
2b480 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
2b490 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
2b4a0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
2b4b0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
2b4c0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
2b4d0 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
2b4e0 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
2b4f0 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
2b500 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
2b510 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
2b520 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b530 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
2b540 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
2b550 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
2b560 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65  set = (i64)pPage
2b570 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
2b580 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2b590 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
2b5a0 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
2b5b0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
2b5c0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
2b5d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2b5e0 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74  NOMEM_BKPT, pDat
2b5f0 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  a2);.      PAGER
2b600 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
2b610 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
2b620 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2b630 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2b640 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
2b650 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
2b660 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
2b670 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2b680 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2b6a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2b6b0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
2b6c0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
2b6d0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
2b6e0 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
2b6f0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
2b700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b710 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
2b720 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
2b730 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2b740 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
2b750 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
2b760 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
2b770 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
2b780 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
2b790 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2b7a0 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2b7b0 65 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ed(PgHdr *pPg){.
2b7c0 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
2b7d0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2b7e0 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75     return subjou
2b7f0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2b800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2b810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b820 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2b830 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2b840 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
2b850 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
2b860 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
2b870 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
2b880 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
2b890 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
2b8a0 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
2b8b0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
2b8c0 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
2b8d0 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
2b8e0 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
2b8f0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
2b900 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
2b910 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2b920 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
2b930 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
2b940 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
2b950 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
2b960 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2b970 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
2b980 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
2b990 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b9a0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
2b9b0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2b9c0 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
2b9d0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
2b9e0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2b9f0 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
2ba00 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
2ba10 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
2ba20 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2ba30 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
2ba40 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
2ba50 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
2ba60 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
2ba70 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
2ba80 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
2ba90 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2baa0 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
2bab0 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
2bac0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2bad0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2bae0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2baf0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
2bb00 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
2bb10 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
2bb20 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2bb30 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2bb40 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
2bb50 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
2bb60 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
2bb70 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
2bb80 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2bb90 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2bba0 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
2bbb0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2bbc0 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
2bbd0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2bbe0 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
2bbf0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2bc00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
2bc10 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
2bc20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bc30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2bc40 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2bc50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2bc60 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2bc70 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
2bc80 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59   doNotSpill NOSY
2bc90 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75  NC bit is set du
2bca0 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
2bcb0 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
2bcc0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
2bcd0 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
2bce0 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
2bcf0 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
2bd00 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
2bd10 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2bd20 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
2bd30 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
2bd40 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
2bd50 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
2bd60 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
2bd70 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
2bd80 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2bd90 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46  ROLLBACK and OFF
2bda0 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61   bits inhibits a
2bdb0 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e  ll cache spillin
2bdc0 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73  g.  ** regardles
2bdd0 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
2bde0 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65  not a sync is re
2bdf0 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73  quired.  This is
2be00 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a   set during.  **
2be10 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62   a rollback or b
2be20 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20  y user request, 
2be30 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
2be40 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67  **.  ** Spilling
2be50 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69   is also prohibi
2be60 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
2be70 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65  rror state since
2be80 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a   that could.  **
2be90 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
2bea0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20  e corruption.   
2beb0 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
2bec0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74  mplementation it
2bed0 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
2bee0 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
2bef0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
2bf00 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
2bf10 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20  createFlag==3.  
2bf20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
2bf30 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
2bf40 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
2bf50 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
2bf60 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
2bf70 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
2bf80 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
2bf90 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
2bfa0 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
2bfb0 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
2bfc0 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
2bfd0 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
2bfe0 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
2bff0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
2c000 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2c010 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
2c020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74  QLITE_OK;.  test
2c030 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2c040 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2c050 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  FLAG_ROLLBACK );
2c060 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2c070 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2c080 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20  & SPILLFLAG_OFF 
2c090 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2c0a0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2c0b0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
2c0c0 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50  SYNC );.  if( pP
2c0d0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2c0e0 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d  .   && ((pPager-
2c0f0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53  >doNotSpill & (S
2c100 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2c110 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29  K|SPILLFLAG_OFF)
2c120 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70  )!=0.      || (p
2c130 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
2c140 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29  R_NEED_SYNC)!=0)
2c150 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2c160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2c170 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
2c180 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55   0;.  if( pagerU
2c190 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2c1a0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  .    /* Write a 
2c1b0 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72  single frame for
2c1c0 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68   this page to th
2c1d0 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  e log. */.    rc
2c1e0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
2c1f0 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29  eIfRequired(pPg)
2c200 3b 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ; .    if( rc==S
2c210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c220 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
2c230 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50  rames(pPager, pP
2c240 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  g, 0, 0);.    }.
2c250 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
2c260 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
2c270 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
2c280 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
2c290 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2c2a0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
2c2b0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
2c2c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2c2d0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
2c2e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
2c2f0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
2c300 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
2c310 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2c320 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2c330 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2c340 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2c350 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c370 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2c380 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2c390 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2c3a0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2c3b0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2c3c0 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2c3d0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2c3e0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2c3f0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2c400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2c410 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2c420 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2c430 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2c440 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2c450 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2c460 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2c470 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2c480 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2c490 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  r, rc); .}../*.*
2c4a0 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65  * Flush all unre
2c4b0 66 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70  ferenced dirty p
2c4c0 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  ages to disk..*/
2c4d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2c4e0 72 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50  rFlush(Pager *pP
2c4f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2c500 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2c510 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  e;.  if( !MEMDB 
2c520 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c  ){.    PgHdr *pL
2c530 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
2c540 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2c550 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2c560 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
2c570 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2c580 61 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69  ager) );.    whi
2c590 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2c5a0 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
2c5b0 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
2c5c0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2c5d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
2c5e0 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  t->nRef==0 ){.  
2c5f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2c600 53 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50  Stress((void*)pP
2c610 61 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ager, pList);.  
2c620 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73      }.      pLis
2c630 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  t = pNext;.    }
2c640 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2c650 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
2c660 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2c670 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
2c680 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
2c690 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
2c6a0 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
2c6b0 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
2c6c0 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
2c6d0 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
2c6e0 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
2c6f0 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
2c700 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
2c710 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2c720 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
2c730 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2c740 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
2c750 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
2c760 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
2c770 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2c780 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
2c790 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
2c7a0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
2c7b0 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
2c7c0 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
2c7d0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
2c7e0 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
2c7f0 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
2c800 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
2c810 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
2c820 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
2c830 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
2c840 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2c850 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
2c860 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
2c870 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
2c880 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2c890 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
2c8a0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
2c8b0 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
2c8c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2c8d0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
2c8e0 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
2c8f0 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
2c900 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
2c910 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2c920 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
2c930 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
2c940 74 45 78 74 72 61 28 29 20 41 50 49 2e 20 20 57  tExtra() API.  W
2c950 68 65 6e 20 61 20 6e 65 77 20 70 61 67 65 20 69  hen a new page i
2c960 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  s allocated, the
2c970 0a 2a 2a 20 66 69 72 73 74 20 38 20 62 79 74 65  .** first 8 byte
2c980 73 20 6f 66 20 74 68 69 73 20 73 70 61 63 65 20  s of this space 
2c990 61 72 65 20 7a 65 72 6f 65 64 20 62 75 74 20 74  are zeroed but t
2c9a0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20  he remainder is 
2c9b0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a  uninitialized..*
2c9c0 2a 20 28 54 68 65 20 65 78 74 72 61 20 73 70 61  * (The extra spa
2c9d0 63 65 20 69 73 20 75 73 65 64 20 62 79 20 62 74  ce is used by bt
2c9e0 72 65 65 20 61 73 20 74 68 65 20 4d 65 6d 50 61  ree as the MemPa
2c9f0 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a  ge object.).**.*
2ca00 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
2ca10 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
2ca20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
2ca30 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
2ca40 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
2ca50 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
2ca60 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
2ca70 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
2ca80 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
2ca90 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61   the PAGER_* fla
2caa0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
2cab0 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
2cac0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
2cad0 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
2cae0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
2caf0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
2cb00 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
2cb10 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
2cb20 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
2cb30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
2cb40 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
2cb50 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
2cb60 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
2cb70 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
2cb80 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
2cb90 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2cba0 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
2cbb0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
2cbc0 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
2cbd0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2cbe0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
2cbf0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
2cc00 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
2cc10 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
2cc20 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2cc30 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2cc40 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
2cc50 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
2cc60 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
2cc70 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2cc80 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
2cc90 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
2cca0 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
2ccb0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
2ccc0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2ccd0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
2cce0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
2ccf0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
2cd00 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
2cd10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
2cd20 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
2cd30 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
2cd40 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2cd50 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2cd60 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2cd70 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2cd80 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
2cd90 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
2cda0 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
2cdb0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
2cdc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2cdd0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cdf0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2ce00 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2ce10 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2ce20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2ce30 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2ce40 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2ce50 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2ce60 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2ce70 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2ce80 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2ce90 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2cea0 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2ceb0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2cec0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2ced0 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2cee0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2cef0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2cf00 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2cf10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2cf20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2cf30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2cf40 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2cf50 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2cf60 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2cf70 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2cf80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2cf90 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2cfa0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2cfb0 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
2cfc0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2cfd0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
2cfe0 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
2cff0 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
2d000 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
2d010 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2d020 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2d030 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
2d040 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2d050 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
2d060 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2d070 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
2d080 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2d090 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2d0a0 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
2d0b0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
2d0c0 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
2d0d0 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
2d0e0 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
2d0f0 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
2d100 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
2d110 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
2d120 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
2d130 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2d140 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
2d150 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66  /.  u32 szPageDf
2d160 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
2d170 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
2d180 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
2d190 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  size */.  const 
2d1a0 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20  char *zUri = 0; 
2d1b0 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74     /* URI args t
2d1c0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
2d1d0 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20  nUri = 0;       
2d1e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d1f0 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61  f bytes of URI a
2d200 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a  rgs at *zUri */.
2d210 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
2d220 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
2d230 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
2d240 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
2d250 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
2d260 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
2d270 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
2d280 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
2d290 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f  ub-journal).  */
2d2a0 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  .  journalFileSi
2d2b0 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2d2c0 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2d2d0 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Vfs));..  /* Set
2d2e0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
2d2f0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
2d300 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
2d310 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
2d320 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
2d330 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
2d340 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
2d350 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
2d360 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
2d370 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c   1;.    if( zFil
2d380 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2d390 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  me[0] ){.      z
2d3a0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2d3b0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46  e3DbStrDup(0, zF
2d3c0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2d3d0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2d3e0 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54    ) return SQLIT
2d3f0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2d400 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2d410 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2d420 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2d430 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2d440 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2d450 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2d460 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2d470 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2d480 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2d490 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2d4a0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2d4b0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2d4c0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2d4d0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2d4e0 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2d4f0 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2d500 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2d510 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2d520 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2d530 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2d540 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2d550 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2d560 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2d570 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2d580 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
2d590 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68  llocRaw(0, nPath
2d5a0 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
2d5b0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
2d5c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d5d0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2d5e0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68  .    }.    zPath
2d5f0 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
2d600 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
2d610 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
2d620 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
2d630 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ls */.    rc = s
2d640 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
2d650 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
2d660 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
2d670 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2d680 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2d690 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2d6a0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  thname);.    z =
2d6b0 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61   zUri = &zFilena
2d6c0 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  me[sqlite3Strlen
2d6d0 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d  30(zFilename)+1]
2d6e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
2d6f0 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  ){.      z += sq
2d700 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2d710 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73  +1;.      z += s
2d720 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2d730 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  )+1;.    }.    n
2d740 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31  Uri = (int)(&z[1
2d750 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61  ] - zUri);.    a
2d760 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29  ssert( nUri>=0 )
2d770 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2d780 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
2d790 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
2d7a0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
2d7b0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2d7c0 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
2d7d0 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
2d7e0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2d7f0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2d800 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
2d810 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
2d820 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2d830 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2d840 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
2d850 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
2d860 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
2d870 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
2d880 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
2d890 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
2d8a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d8b0 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
2d8c0 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
2d8d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
2d8e0 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
2d8f0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2d900 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2d910 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2d920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d930 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d940 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2d950 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
2d960 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2d970 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
2d980 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
2d990 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
2d9a0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
2d9b0 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
2d9c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2d9d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d9e0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
2d9f0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
2da00 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
2da10 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
2da20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2da30 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
2da40 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2da50 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
2da60 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
2da70 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
2da80 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2da90 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2daa0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
2dab0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2dac0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
2dad0 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
2dae0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
2daf0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
2db00 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2db10 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
2db20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2db30 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2db40 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
2db50 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2db60 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2db70 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2db80 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
2db90 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2dba0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
2dbb0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
2dbc0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2dbe0 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
2dbf0 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
2dc00 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
2dc10 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
2dc20 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2dc30 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
2dc40 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2dc50 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2dc60 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
2dc70 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
2dc80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
2dc90 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2dca0 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
2dcb0 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
2dcc0 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
2dcd0 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
2dce0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2dcf0 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
2dd00 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
2dd10 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20  me + 1 + nUri + 
2dd20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2dd30 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
2dd40 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20  hname + 8 + 2   
2dd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
2dd60 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
2dd70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2dd80 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
2dd90 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20  e + 4 + 2       
2dda0 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a       /* zWal */.
2ddb0 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73  #endif.  );.  as
2ddc0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2ddd0 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
2dde0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
2ddf0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
2de00 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
2de10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2de20 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2de30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2de40 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2de50 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
2de60 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
2de70 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
2de80 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
2de90 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
2dea0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
2deb0 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
2dec0 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
2ded0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2dee0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2def0 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
2df00 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
2df10 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2df20 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
2df30 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
2df40 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
2df50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2df60 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2df70 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
2df80 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
2df90 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2dfa0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2dfb0 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
2dfc0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2dfd0 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
2dfe0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2dff0 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
2e000 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
2e010 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
2e020 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
2e030 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
2e040 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
2e050 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a   nPathname>0 );.
2e060 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
2e070 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
2e080 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
2e090 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a  me + 1 + nUri);.
2e0a0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2e0b0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
2e0c0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2e0d0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72  me);.    if( nUr
2e0e0 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67  i ) memcpy(&pPag
2e0f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
2e100 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69  athname+1], zUri
2e110 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  , nUri);.    mem
2e120 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2e130 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2e140 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2e150 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2e160 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2e170 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c  ame], "-journal\
2e180 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20  000", 8+2);.    
2e190 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2e1a0 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2e1b0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  name, pPager->zJ
2e1c0 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66  ournal);.#ifndef
2e1d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2e1e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61  .    pPager->zWa
2e1f0 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  l = &pPager->zJo
2e200 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b  urnal[nPathname+
2e210 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  8+1];.    memcpy
2e220 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a  (pPager->zWal, z
2e230 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2e240 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2e250 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e  (&pPager->zWal[n
2e260 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c  Pathname], "-wal
2e270 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20  \000", 4+1);.   
2e280 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2e290 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2e2a0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2e2b0 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Wal);.#endif.   
2e2c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2e2d0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2e2e0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
2e2f0 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
2e300 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
2e310 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
2e320 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
2e330 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
2e340 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2e350 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
2e360 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e380 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
2e390 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
2e3a0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2e3b0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2e3c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e3d0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
2e3e0 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
2e3f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
2e400 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64  emDb );.    read
2e410 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
2e420 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e430 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
2e440 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
2e450 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
2e460 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2e470 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
2e480 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
2e490 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
2e4a0 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
2e4b0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
2e4c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2e4d0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2e4e0 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
2e4f0 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
2e500 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
2e510 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2e520 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
2e530 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2e540 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
2e550 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
2e560 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
2e570 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
2e580 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
2e590 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
2e5a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2e5b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e5c0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
2e5d0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2e5e0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2e5f0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69  er->fd);.      i
2e600 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  f( !readOnly ){.
2e610 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f          setSecto
2e620 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2e630 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2e640 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2e650 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
2e660 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2e670 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69  SIZE);.        i
2e680 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2e690 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2e6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2e6b0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2e6c0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2e6d0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2e6e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2e6f0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2e700 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2e710 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
2e720 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e730 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2e740 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65  flt = (u32)pPage
2e750 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
2e760 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e770 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2e780 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2e790 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b  _WRITE.        {
2e7a0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2e7b0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  i;.          ass
2e7c0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2e7d0 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
2e7e0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
2e7f0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2e800 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
2e810 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
2e820 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2e830 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2e840 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
2e850 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  6);.          fo
2e860 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2e870 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2e880 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2e890 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2e8a0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
2e8b0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
2e8c0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
2e8d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e8e0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
2e8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e910 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2e920 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
2e930 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74  ->noLock = sqlit
2e940 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2e950 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63  Filename, "noloc
2e960 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  k", 0);.      if
2e970 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ( (iDc & SQLITE_
2e980 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29  IOCAP_IMMUTABLE)
2e990 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  !=0.       || sq
2e9a0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2e9b0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d  n(zFilename, "im
2e9c0 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a  mutable", 0) ){.
2e9d0 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61            vfsFla
2e9e0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
2e9f0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
2ea00 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c        goto act_l
2ea10 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20  ike_temp_file;. 
2ea20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ea30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2ea40 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2ea50 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
2ea60 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
2ea70 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
2ea80 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
2ea90 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
2eaa0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2eab0 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
2eac0 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
2ead0 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
2eae0 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
2eaf0 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
2eb00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2eb10 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
2eb20 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
2eb30 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
2eb40 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
2eb50 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
2eb60 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
2eb70 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
2eb80 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
2eb90 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
2eba0 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
2ebb0 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
2ebc0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a  journal..    **.
2ebd0 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2ebe0 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72  ch also runs for
2ebf0 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73   files marked as
2ec00 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20   immutable..    
2ec10 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d  */ .act_like_tem
2ec20 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70  p_file:.    temp
2ec30 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
2ec40 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2ec50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20  AGER_READER;    
2ec60 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61   /* Pretend we a
2ec70 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
2ec80 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  ck */.    pPager
2ec90 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53  ->eLock = EXCLUS
2eca0 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20  IVE_LOCK;    /* 
2ecb0 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69  Pretend we are i
2ecc0 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65  n EXCLUSIVE mode
2ecd0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2ece0 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20  noLock = 1;     
2ecf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2ed00 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20   no locking */. 
2ed10 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
2ed20 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
2ed30 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2ed40 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
2ed50 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
2ed60 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2ed70 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
2ed80 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
2ed90 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
2eda0 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
2edb0 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
2edc0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2edd0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2ede0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2edf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
2ee00 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
2ee10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
2ee20 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
2ee30 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
2ee40 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
2ee50 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
2ee60 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   );.  }..  /* In
2ee70 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
2ee80 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
2ee90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2eea0 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61  OK ){.    nExtra
2eeb0 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2eec0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2eed0 45 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74  Extra>=8 && nExt
2eee0 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72  ra<1000 );.    r
2eef0 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
2ef00 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
2ef10 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
2ef20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ef30 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2ef40 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2ef50 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2ef60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2ef70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2ef80 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2ef90 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2efa0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2efb0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2efc0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2efd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2efe0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2eff0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2f000 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2f010 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
2f020 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c  pSpace);.    sql
2f030 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2f040 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2f050 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2f060 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2f070 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2f080 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2f090 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f0a0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2f0b0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2f0c0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2f0d0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2f0e0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2f0f0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2f100 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2f110 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2f120 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2f130 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2f140 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2f150 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2f160 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2f170 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2f180 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2f190 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2f1a0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2f1b0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2f1c0 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2f1d0 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2f1e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2f1f0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2f200 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2f210 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2f220 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2f230 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2f240 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2f250 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2f260 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2f270 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2f280 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2f290 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2f2a0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2f2b0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2f2c0 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2f2d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2f2e0 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2f2f0 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2f300 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2f310 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2f320 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2f330 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2f340 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2f350 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2f360 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2f370 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2f380 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2f390 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2f3a0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2f3b0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
2f3c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2f3d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2f3e0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2f3f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2f400 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
2f410 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2f420 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2f430 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2f440 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f450 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2f460 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f470 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2f480 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
2f490 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
2f4a0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
2f4b0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61     pPager->extra
2f4c0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
2f4d0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
2f4e0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2f4f0 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
2f500 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
2f510 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2f520 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54  MAL | WAL_SYNC_T
2f530 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20  RANSACTIONS;.   
2f540 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2f550 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2f560 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
2f570 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
2f580 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
2f590 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2f5a0 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
2f5b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
2f5c0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
2f5d0 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
2f5e0 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
2f5f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
2f600 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
2f610 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
2f620 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
2f630 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2f640 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
2f650 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
2f660 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2f670 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
2f680 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2f690 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2f6a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2f6b0 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
2f6c0 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
2f6d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2f6e0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2f6f0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
2f700 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
2f710 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
2f720 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f730 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
2f740 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2f750 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
2f760 52 65 69 6e 69 74 3b 0a 20 20 73 65 74 47 65 74  Reinit;.  setGet
2f770 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72  terMethod(pPager
2f780 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  );.  /* memset(p
2f790 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
2f7a0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2f7b0 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a  aHash)); */.  /*
2f7c0 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
2f7d0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2f7e0 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69  _MMAP_SIZE // wi
2f7f0 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72  ll be set by btr
2f800 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  ee.c */..  *ppPa
2f810 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
2f820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f830 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20  ;.}.../* Verify 
2f840 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2f850 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
2f860 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e  e deleted or ren
2f870 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a  amed out from.**
2f880 20 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72   under the pager
2f890 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
2f8a0 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62  _OK if the datab
2f8b0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72  ase is still wer
2f8c0 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f  e it ought.** to
2f8d0 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65   be on disk.  Re
2f8e0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53  turn non-zero (S
2f8f0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
2f900 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f  BMOVED or some o
2f910 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  ther error.** co
2f920 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f  de from sqlite3O
2f930 73 41 63 63 65 73 73 28 29 29 20 69 66 20 74 68  sAccess()) if th
2f940 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 67  e database has g
2f950 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a  one missing..*/.
2f960 73 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62  static int datab
2f970 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67  aseIsUnmoved(Pag
2f980 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2f990 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30  nt bHasMoved = 0
2f9a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
2f9b0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
2f9c0 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
2f9d0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
2f9e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
2f9f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2fa00 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
2fa10 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2fa20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  && pPager->zFile
2fa30 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20  name[0] );.  rc 
2fa40 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
2fa50 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
2fa60 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
2fa70 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73  HAS_MOVED, &bHas
2fa80 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63  Moved);.  if( rc
2fa90 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
2faa0 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  D ){.    /* If t
2fab0 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c  he HAS_MOVED fil
2fac0 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69  e-control is uni
2fad0 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75  mplemented, assu
2fae0 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
2faf0 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
2fb00 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61  been moved.  Tha
2fb10 74 20 69 73 20 74 68 65 20 68 69 73 74 6f 72 69  t is the histori
2fb20 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20  cal behavior of 
2fb30 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f  SQLite: prior to
2fb40 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
2fb50 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20  3.8.3, it never 
2fb60 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72  checked */.    r
2fb70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2fb80 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2fb90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73  QLITE_OK && bHas
2fba0 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20  Moved ){.    rc 
2fbb0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
2fbc0 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20  Y_DBMOVED;.  }. 
2fbd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2fbe0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2fbf0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
2fc00 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
2fc10 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
2fc20 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
2fc30 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
2fc40 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
2fc50 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
2fc60 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
2fc70 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
2fc80 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
2fc90 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
2fca0 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
2fcb0 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
2fcc0 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
2fcd0 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
2fce0 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
2fcf0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
2fd00 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
2fd10 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
2fd20 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
2fd30 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2fd40 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
2fd50 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
2fd60 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
2fd70 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
2fd80 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
2fd90 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2fda0 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
2fdb0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
2fdc0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
2fdd0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
2fde0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
2fdf0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
2fe00 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
2fe10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2fe20 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
2fe30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
2fe40 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
2fe50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2fe60 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
2fe70 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
2fe80 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
2fe90 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
2fea0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
2feb0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
2fec0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
2fed0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
2fee0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
2fef0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
2ff00 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
2ff10 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
2ff20 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
2ff30 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
2ff40 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
2ff50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2ff60 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
2ff70 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
2ff80 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
2ff90 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
2ffa0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
2ffb0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
2ffc0 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
2ffd0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
2ffe0 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
2fff0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
30000 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
30010 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
30020 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
30030 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
30040 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
30050 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
30060 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
30070 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
30080 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
30090 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
300a0 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
300b0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
300c0 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
300d0 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
300e0 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
300f0 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
30100 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
30110 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
30120 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
30130 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
30140 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
30150 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
30160 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
30170 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
30180 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
30190 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
301a0 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
301b0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
301c0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
301d0 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
301e0 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
301f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
30200 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
30210 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
30220 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
30230 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
30240 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
30250 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
30260 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
30270 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
30280 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
30290 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
302a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
302b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
302c0 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20  t exists = 1;   
302d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
302e0 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
302f0 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
30300 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70   */.  int jrnlOp
30310 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50  en = !!isOpen(pP
30320 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61  ager->jfd);..  a
30330 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
30340 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
30350 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
30360 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61  ager->fd) );.  a
30370 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
30380 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30390 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  N );..  assert( 
303a0 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28  jrnlOpen==0 || (
303b0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
303c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
303d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20  pPager->jfd) &. 
303e0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
303f0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
30400 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a  _OPEN.  ));..  *
30410 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69  pExists = 0;.  i
30420 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
30430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30440 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
30450 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
30460 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
30470 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
30480 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
30490 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
304a0 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f  ts ){.    int lo
304b0 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  cked = 0;       
304c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
304d0 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f   some process ho
304e0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  lds a RESERVED l
304f0 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ock */..    /* R
30500 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65  ace condition he
30510 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f  re:  Another pro
30520 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20  cess might have 
30530 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65  been holding the
30540 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45  .    ** the RESE
30550 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61  RVED lock and ha
30560 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65  ve a journal ope
30570 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  n at the sqlite3
30580 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20  OsAccess() .    
30590 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62  ** call above, b
305a0 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ut then delete t
305b0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64  he journal and d
305c0 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66  rop the lock bef
305d0 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65  ore.    ** we ge
305e0 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
305f0 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  ng sqlite3OsChec
30600 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20  kReservedLock() 
30610 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20  call.  If that. 
30620 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73     ** is the cas
30630 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
30640 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72  might think ther
30650 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
30660 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69  al when.    ** i
30670 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20  n fact there is 
30680 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75  none.  This resu
30690 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70  lts in a false-p
306a0 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69  ositive which wi
306b0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  ll.    ** be dea
306c0 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70  lt with by the p
306d0 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e  layback routine.
306e0 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a    Ticket #3883..
306f0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
30700 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
30710 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
30720 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b  r->fd, &locked);
30730 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
30740 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65  ITE_OK && !locke
30750 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  d ){.      Pgno 
30760 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
30770 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30780 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
30790 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
307a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
307b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
307c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
307d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
307e0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
307f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30810 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
30820 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67  base is zero pag
30830 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74  es in size, that
30840 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68   means that eith
30850 65 72 20 28 31 29 20 74 68 65 0a 20 20 20 20 20  er (1) the.     
30860 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73     ** journal is
30870 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20   a remnant from 
30880 61 20 70 72 69 6f 72 20 64 61 74 61 62 61 73 65  a prior database
30890 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
308a0 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20 20  ame where.      
308b0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
308c0 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74  e file but not t
308d0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64  he journal was d
308e0 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74  eleted, or (2) t
308f0 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20  he initial.     
30900 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
30910 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73  n that populates
30920 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
30930 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
30940 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
30950 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
30960 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30970 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  e can be deleted
30980 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65  .  However, take
30990 20 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   care.        **
309a0 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74   not to delete t
309b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
309c0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
309d0 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20   open due to.   
309e0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f       ** journal_
309f0 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20  mode=PERSIST..  
30a00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30a10 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26   if( nPage==0 &&
30a20 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
30a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
30a40 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
30a50 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
30a60 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  ( pagerLockDb(pP
30a70 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
30a80 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
30a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
30aa0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
30ab0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
30ac0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
30ad0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
30ae0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
30af0 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  e ) pagerUnlockD
30b00 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
30b10 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
30b20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
30b30 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
30b40 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
30b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30b60 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
30b70 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
30b80 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
30b90 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
30ba0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
30bb0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
30bc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30bd0 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
30be0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
30bf0 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
30c00 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
30c10 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
30c20 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
30c30 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
30c40 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
30c50 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
30c60 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
30c70 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
30c80 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
30c90 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
30ca0 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
30cb0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
30cc0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
30cd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
30ce0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
30cf0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
30d00 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
30d10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30d20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
30d30 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
30d40 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
30d50 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20  fd, f, &f);.    
30d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30d70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30d80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30d90 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
30da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30db0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
30dc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
30dd0 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
30de0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
30df0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
30e00 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
30e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30e20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30e40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
30e50 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
30e60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30e70 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
30e80 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
30e90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30ea0 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72   *pExists = (fir
30eb0 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  st!=0);.        
30ec0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
30ed0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
30ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
30ef0 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  * If we cannot o
30f00 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  pen the rollback
30f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
30f20 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66   order to see if
30f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30f40 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  it has a zero he
30f50 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
30f60 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
30f70 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
30f80 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
30f90 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
30fa0 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
30fb0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
30fc0 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
30fd0 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
30fe0 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
30ff0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
31000 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
31010 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
31020 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
31030 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
31040 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
31050 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
31060 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
31070 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
31080 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
31090 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
310a0 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
310b0 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
310c0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
310d0 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
310e0 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
310f0 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
31100 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
31110 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
31120 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
31130 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
31140 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
31150 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
31160 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
31170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31180 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
31190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
311a0 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
311b0 5f 45 44 49 54 49 4f 4e 0a 73 74 61 74 69 63 20  _EDITION.static 
311c0 69 6e 74 20 70 61 67 65 72 53 65 72 76 65 72 43  int pagerServerC
311d0 6f 6e 6e 65 63 74 28 50 61 67 65 72 20 2a 70 50  onnect(Pager *pP
311e0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
311f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
31200 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
31210 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ile==0 ){.    in
31220 74 20 69 43 6c 69 65 6e 74 20 3d 20 30 3b 0a 20  t iClient = 0;. 
31230 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63     pPager->noLoc
31240 6b 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  k = 1;.    pPage
31250 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
31260 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31270 44 45 5f 50 45 52 53 49 53 54 3b 0a 20 20 20 20  DE_PERSIST;.    
31280 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 72 76  rc = sqlite3Serv
31290 65 72 43 6f 6e 6e 65 63 74 28 70 50 61 67 65 72  erConnect(pPager
312a0 2c 20 26 70 50 61 67 65 72 2d 3e 70 53 65 72 76  , &pPager->pServ
312b0 65 72 2c 20 26 69 43 6c 69 65 6e 74 29 3b 0a 20  er, &iClient);. 
312c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
312d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
312e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
312f0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
31300 28 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 2d  (.          "%s-
31310 6a 6f 75 72 6e 61 6c 25 64 22 2c 20 70 50 61 67  journal%d", pPag
31320 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  er->zFilename, i
31330 43 6c 69 65 6e 74 0a 20 20 20 20 20 20 29 3b 0a  Client.      );.
31340 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
31350 2d 3e 7a 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  ->zJournal==0 ){
31360 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31370 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
31380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31390 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
313a0 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  }..int sqlite3Pa
313b0 67 65 72 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e  gerRollbackJourn
313c0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
313d0 2c 20 69 6e 74 20 69 43 6c 69 65 6e 74 29 7b 0a  , int iClient){.
313e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
313f0 20 2a 7a 4a 72 6e 6c 20 3d 20 73 71 6c 69 74 65   *zJrnl = sqlite
31400 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 6a 6f  3_mprintf("%s-jo
31410 75 72 6e 61 6c 25 64 22 2c 20 70 50 61 67 65 72  urnal%d", pPager
31420 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 43 6c  ->zFilename, iCl
31430 69 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20 7a 4a  ient);..  if( zJ
31440 72 6e 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  rnl ){.    int b
31450 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20  Exists = 0;.    
31460 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
31470 64 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  d = 0;.    sqlit
31480 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
31490 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
314a0 66 73 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  fs;..    rc = sq
314b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
314c0 66 73 2c 20 7a 4a 72 6e 6c 2c 20 53 51 4c 49 54  fs, zJrnl, SQLIT
314d0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
314e0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
314f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31500 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
31510 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
31520 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
31530 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
31540 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
31550 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
31560 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
31570 28 70 56 66 73 2c 20 7a 4a 72 6e 6c 2c 20 26 6a  (pVfs, zJrnl, &j
31580 66 64 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61 67  fd, flags, &flag
31590 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  s);.    }.    as
315a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
315b0 5f 4f 4b 20 7c 7c 20 6a 66 64 3d 3d 30 20 29 3b  _OK || jfd==0 );
315c0 0a 20 20 20 20 69 66 28 20 6a 66 64 20 29 7b 0a  .    if( jfd ){.
315d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
315e0 6c 65 20 2a 73 61 76 65 64 5f 6a 66 64 20 3d 20  le *saved_jfd = 
315f0 70 50 61 67 65 72 2d 3e 6a 66 64 3b 0a 20 20 20  pPager->jfd;.   
31600 20 20 20 75 38 20 73 61 76 65 64 5f 65 53 74 61     u8 saved_eSta
31610 74 65 20 3d 20 70 50 61 67 65 72 2d 3e 65 53 74  te = pPager->eSt
31620 61 74 65 3b 0a 20 20 20 20 20 20 75 38 20 73 61  ate;.      u8 sa
31630 76 65 64 5f 65 4c 6f 63 6b 20 3d 20 70 50 61 67  ved_eLock = pPag
31640 65 72 2d 3e 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  er->eLock;.     
31650 20 69 36 34 20 73 61 76 65 64 5f 6a 6f 75 72 6e   i64 saved_journ
31660 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  alOff = pPager->
31670 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
31680 20 20 69 36 34 20 73 61 76 65 64 5f 6a 6f 75 72    i64 saved_jour
31690 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
316a0 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 20  >journalHdr;.   
316b0 20 20 20 63 68 61 72 20 2a 73 61 76 65 64 5f 7a     char *saved_z
316c0 4a 6f 75 72 6e 61 6c 20 3d 20 70 50 61 67 65 72  Journal = pPager
316d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 0a 20 20 20  ->zJournal;..   
316e0 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
316f0 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
31700 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  K;.      pPager-
31710 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
31720 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20  WRITER_DBMOD;.  
31730 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20      pPager->jfd 
31740 3d 20 6a 66 64 3b 0a 20 20 20 20 20 20 72 63 20  = jfd;.      rc 
31750 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
31760 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
31770 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31780 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 70 61  ITE_OK ) rc = pa
31790 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
317a0 67 65 72 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  ger, 1);..      
317b0 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 73 61  pPager->jfd = sa
317c0 76 65 64 5f 6a 66 64 3b 0a 20 20 20 20 20 20 70  ved_jfd;.      p
317d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
317e0 73 61 76 65 64 5f 65 53 74 61 74 65 3b 0a 20 20  saved_eState;.  
317f0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
31800 6b 20 3d 20 73 61 76 65 64 5f 65 4c 6f 63 6b 3b  k = saved_eLock;
31810 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
31820 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 61 76 65  ournalOff = save
31830 64 5f 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  d_journalOff;.  
31840 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
31850 6e 61 6c 48 64 72 20 3d 20 73 61 76 65 64 5f 6a  nalHdr = saved_j
31860 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 20 20 20  ournalHdr;.     
31870 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31880 6c 20 3d 20 73 61 76 65 64 5f 7a 4a 6f 75 72 6e  l = saved_zJourn
31890 61 6c 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  al;..      sqlit
318a0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 6a 66  e3OsCloseFree(jf
318b0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
318c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
318d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
318e0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
318f0 2c 20 7a 4a 72 6e 6c 2c 20 30 29 3b 0a 20 20 20  , zJrnl, 0);.   
31900 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
31910 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4a 72 6e  qlite3_free(zJrn
31920 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
31930 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
31940 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
31950 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
31960 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
31970 65 72 53 65 72 76 65 72 43 6f 6e 6e 65 63 74 28  erServerConnect(
31980 70 50 61 67 65 72 29 20 53 51 4c 49 54 45 5f 4f  pPager) SQLITE_O
31990 4b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  K.#endif.../*.**
319a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
319b0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
319c0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
319d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
319e0 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
319f0 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
31a00 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31a10 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
31a20 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
31a30 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
31a40 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
31a50 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
31a60 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
31a70 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
31a80 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
31a90 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
31aa0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
31ab0 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
31ac0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
31ad0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
31ae0 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
31af0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
31b00 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
31b10 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c  OPEN state (no l
31b20 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
31b30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31b40 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
31b50 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
31b60 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
31b70 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
31b80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31b90 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
31ba0 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
31bb0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
31bc0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
31bd0 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
31be0 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
31bf0 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
31c00 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
31c10 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
31c20 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
31c30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
31c40 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
31c50 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
31c60 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
31c70 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
31c80 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
31c90 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
31ca0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
31cb0 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
31cc0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
31cd0 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
31ce0 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
31cf0 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
31d00 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
31d10 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
31d20 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
31d30 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
31d40 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
31d50 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
31d60 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
31d70 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
31d80 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31d90 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
31da0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
31db0 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
31dc0 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
31dd0 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
31de0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
31df0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
31e00 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
31e10 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
31e20 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
31e30 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
31e40 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
31e50 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
31e60 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
31e70 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
31e80 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
31e90 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
31ea0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
31eb0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
31ec0 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62  or .** rolling b
31ed0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
31ee0 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
31ef0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
31f00 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
31f10 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
31f20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
31f30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
31f40 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
31f50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
31f60 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
31f70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
31f80 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
31f90 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
31fa0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
31fb0 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
31fc0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
31fd0 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
31fe0 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
31ff0 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
32000 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
32010 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
32020 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
32030 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
32040 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
32050 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 20  ve access mode. 
32060 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
32070 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
32080 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
32090 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  che)==0 );.  ass
320a0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
320b0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
320c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
320d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
320e0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
320f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32100 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
32110 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
32120 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
32130 29 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  );..  if( !pager
32140 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
32150 20 20 20 26 26 20 21 70 61 67 65 72 49 73 53 65     && !pagerIsSe
32160 72 76 65 72 28 70 50 61 67 65 72 29 20 0a 20 20  rver(pPager) .  
32170 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
32180 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
32190 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
321a0 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
321b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
321c0 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
321d0 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
321e0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
321f0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
32200 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
32210 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
32220 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
32230 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
32240 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
32250 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
32260 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
32270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
32290 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
322a0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
322b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
322c0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
322d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
322e0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
322f0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
32300 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
32310 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
32320 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
32330 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
32340 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
32350 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
32360 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
32370 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
32380 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
32390 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
323a0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
323b0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
323c0 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
323d0 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
323e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
323f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
32400 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
32410 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
32420 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l ){.      if( p
32430 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
32440 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
32450 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
32460 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
32470 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32480 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
32490 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
324a0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
324b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
324c0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
324d0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
324e0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
324f0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
32500 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
32510 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
32520 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
32530 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
32540 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
32550 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
32560 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
32570 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
32580 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
32590 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
325a0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
325b0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
325c0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
325d0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
325e0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
325f0 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
32600 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
32610 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
32620 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
32630 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
32640 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
32650 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
32660 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
32670 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
32680 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
32690 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
326a0 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
326b0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
326c0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
326d0 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
326e0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
326f0 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
32700 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32710 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
32720 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   ** Unless the p
32730 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69  ager is in locki
32740 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
32750 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  e mode, the lock
32760 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77   is.      ** dow
32770 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45  ngraded to SHARE
32780 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68  D_LOCK before th
32790 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
327a0 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rns..      */.  
327b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
327c0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
327d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
327e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
327f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32800 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32810 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
32820 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
32830 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74  ready open and t
32840 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f  he file exists o
32850 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65  n disk, open the
32860 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
32870 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
32880 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20  e access. Write 
32890 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72  access is requir
328a0 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20  ed because .    
328b0 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76    ** in exclusiv
328c0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
328d0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
328e0 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
328f0 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  pen .      ** an
32900 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  d possibly used 
32910 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
32920 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f  n later on. Also
32930 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a  , write-access .
32940 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61        ** is usua
32950 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  lly required to 
32960 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
32970 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  rnal in journal_
32980 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20  mode=persist .  
32990 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64      ** mode (and
329a0 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61   also for journa
329b0 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20  l_mode=truncate 
329c0 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29  on some systems)
329d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
329e0 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   ** If the journ
329f0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
32a00 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
32a10 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
32a20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
32a30 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
32a40 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
32a50 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
32a60 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  re .      ** thi
32a70 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
32a80 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
32a90 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
32aa0 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  Or, it .      **
32ab0 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
32ac0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
32ad0 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
32ae0 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
32af0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
32b00 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
32b10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
32b20 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
32b30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
32b40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32b50 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fd) ){.        s
32b60 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
32b70 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
32b80 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20  ->pVfs;.        
32b90 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20  int bExists;    
32ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
32bb0 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
32bc0 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
32bd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32be0 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
32bf0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
32c00 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
32c10 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
32c20 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20  TS, &bExists);. 
32c30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
32c40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
32c50 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sts ){.         
32c60 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
32c70 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
32c80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
32c90 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
32ca0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
32cb0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
32cc0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
32cd0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
32ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
32cf0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
32d00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
32d10 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
32d20 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ut);.          a
32d30 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
32d40 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
32d50 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
32d60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
32d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
32d80 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
32d90 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
32da0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32db0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
32dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
32dd0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
32de0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
32df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32e00 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
32e10 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
32e20 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
32e30 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
32e40 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
32e50 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
32e60 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
32e70 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74  ad lock. Purge t
32e80 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a  he cache before.
32e90 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67        ** playing
32ea0 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f   back the hot-jo
32eb0 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65  urnal so that we
32ec0 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69   don't end up wi
32ed0 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
32ee0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
32ef0 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74  e.  Sync the hot
32f00 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
32f10 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a  playing.      **
32f20 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74   it back since t
32f30 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
32f40 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74  crashed and left
32f50 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
32f60 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
32f70 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20  ly did not sync 
32f80 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65  it and we are re
32f90 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73  quired to always
32fa0 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74   sync.      ** t
32fb0 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
32fc0 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  e playing it bac
32fd0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
32fe0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
32ff0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
33000 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
33010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
33020 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
33030 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
33040 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
33050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33060 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
33070 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
33080 63 6b 28 70 50 61 67 65 72 2c 20 21 70 50 61 67  ck(pPager, !pPag
33090 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
330a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
330b0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
330c0 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OPEN;.        }.
330d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
330e0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
330f0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
33100 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28    pagerUnlockDb(
33110 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
33120 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OCK);.      }.. 
33130 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33150 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
33160 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20   is taken if an 
33170 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
33180 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  le trying to ope
33190 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  n.        ** or 
331a0 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d  roll back a hot-
331b0 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f  journal while ho
331c0 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
331d0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
331e0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e       ** pager_un
331f0 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  lock() routine w
33200 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
33210 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74  fore returning t
33220 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20  o unlock.       
33230 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66   ** the file. If
33240 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65   the unlock atte
33250 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  mpt fails, then 
33260 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74  Pager.eLock must
33270 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
33280 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
33290 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d  CK (see the comm
332a0 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
332b0 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20  efine for .     
332c0 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f     ** UNKNOWN_LO
332d0 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20  CK above for an 
332e0 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20  explanation). . 
332f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
33300 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
33310 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63   get pager_unloc
33320 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20  k() to do this, 
33330 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65  set Pager.eState
33340 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50   to.        ** P
33350 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20  AGER_ERROR now. 
33360 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
33370 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20  ally counted as 
33380 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20  a transition.   
33390 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52       ** to ERROR
333a0 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74   state in the st
333b0 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74  ate diagram at t
333c0 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
333d0 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
333e0 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
333f0 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c  at the same call
33400 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
33410 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20  () will very.   
33420 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20       ** shortly 
33430 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70  transition the p
33440 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  ager object to t
33450 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43  he OPEN state. C
33460 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  alling.        *
33470 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  * assert_pager_s
33480 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69  tate() would fai
33490 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f  l now, as it sho
334a0 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
334b0 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ble.        ** t
334c0 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74  o be in ERROR st
334d0 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61  ate when there a
334e0 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64  re zero outstand
334f0 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20  ing page .      
33500 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e    ** references.
33510 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
33520 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
33530 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
33540 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
33550 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
33560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33570 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
33580 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PEN );.      ass
33590 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
335a0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
335b0 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
335c0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
335d0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
335e0 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ->eLock>SHARED_L
335f0 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  OCK).      );.  
33600 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
33610 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
33620 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c  & pPager->hasHel
33630 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20  dSharedLock ){. 
33640 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
33650 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
33660 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 74   been acquired t
33670 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20  hen check to.   
33680 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65     ** see if the
33690 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
336a0 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
336b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
336c0 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20  s changed,.     
336d0 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61   ** flush the ca
336e0 63 68 65 2e 20 20 54 68 65 20 68 61 73 48 65 6c  che.  The hasHel
336f0 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67  dSharedLock flag
33700 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66   prevents this f
33710 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  rom.      ** occ
33720 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65  urring on the ve
33730 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73 20  ry first access 
33740 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72  to a file, in or
33750 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20  der to save a.  
33760 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e      ** single un
33770 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74 65  necessary sqlite
33780 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61  3OsRead() call a
33790 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a  t the start-up..
337a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
337b0 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
337c0 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20  es are detected 
337d0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
337e0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
337f0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
33800 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
33810 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
33820 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
33830 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
33840 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
33850 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
33860 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
33870 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
33880 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
33890 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
338a0 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
338b0 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
338c0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
338d0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
338e0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
338f0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
33900 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
33910 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
33920 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
33930 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
33940 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
33950 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
33960 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
33970 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
33980 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
33990 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
339a0 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
339b0 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
339c0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
339d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
339e0 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
339f0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
33a00 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
33a10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
33a20 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
33a30 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
33a40 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
33a50 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
33a60 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
33a70 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
33a80 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
33a90 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
33aa0 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
33ab0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
33ac0 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
33ad0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33ae0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
33af0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
33b00 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
33b10 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
33b20 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
33b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33b40 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
33b50 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
33b60 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
33b70 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
33b80 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
33b90 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
33ba0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
33bb0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
33bc0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
33bd0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  eset(pPager);.. 
33be0 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20         /* Unmap 
33bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33c00 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  e. It is possibl
33c10 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20  e that external 
33c20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20  processes.      
33c30 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72    ** may have tr
33c40 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61  uncated the data
33c50 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
33c60 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62  en extended it b
33c70 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ack.        ** t
33c80 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
33c90 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70  ize while this p
33ca0 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68  rocess was not h
33cb0 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20  olding a lock.. 
33cc0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
33cd0 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79  s case there may
33ce0 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70   exist a Pager.p
33cf0 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74  Map mapping that
33d00 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20   appears.       
33d10 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69   ** to be the ri
33d20 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20  ght size but is 
33d30 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c  not actually val
33d40 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20  id. Avoid this. 
33d50 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
33d60 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69  ility by unmappi
33d70 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20  ng the db here. 
33d80 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55  */.        if( U
33d90 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
33da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
33db0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
33dc0 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
33dd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33de0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
33df0 20 3d 20 70 61 67 65 72 53 65 72 76 65 72 43 6f   = pagerServerCo
33e00 6e 6e 65 63 74 28 70 50 61 67 65 72 29 3b 0a 0a  nnect(pPager);..
33e10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
33e20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e  is a WAL file in
33e30 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
33e40 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61  , open this data
33e50 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20  base in WAL.    
33e60 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69  ** mode. Otherwi
33e70 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
33e80 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  g function call 
33e90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
33ea0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
33eb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33ec0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
33ed0 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
33ee0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  ger);.    }.#ifn
33ef0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33f00 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20  WAL.    assert( 
33f10 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20  pPager->pWal==0 
33f20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
33f30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   );.#endif.  }..
33f40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
33f50 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69  RVER_EDITION.  i
33f60 66 28 20 70 61 67 65 72 49 73 53 65 72 76 65 72  f( pagerIsServer
33f70 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
33f80 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
33f90 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 70 61 67  TE_OK );.    pag
33fa0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
33fb0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33fc0 65 33 53 65 72 76 65 72 42 65 67 69 6e 28 70 50  e3ServerBegin(pP
33fd0 61 67 65 72 2d 3e 70 53 65 72 76 65 72 29 3b 0a  ager->pServer);.
33fe0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
33ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
34000 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
34010 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
34020 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34030 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
34040 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
34050 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
34060 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
34070 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
34080 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
34090 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
340a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
340b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
340c0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
340d0 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
340e0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
340f0 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
34100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
34110 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
34120 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
34130 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
34140 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
34150 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
34160 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
34170 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
34180 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
34190 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48      pPager->hasH
341a0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20  eldSharedLock = 
341b0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
341c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
341d0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
341e0 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
341f0 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61  zero, rollback a
34200 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  ny active.** tra
34210 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c  nsaction and unl
34220 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  ock the pager..*
34230 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20  *.** Except, in 
34240 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
34250 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72  LUSIVE when ther
34260 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
34270 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  in.** the rollba
34280 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20  ck journal, the 
34290 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65  unlock is not pe
342a0 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72  rformed and ther
342b0 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  e is.** nothing 
342c0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20  to rollback, so 
342d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
342e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61  a no-op..*/ .sta
342f0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
34300 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67  lockIfUnused(Pag
34310 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
34320 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  f( pPager->nMmap
34330 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74  Out==0 && (sqlit
34340 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
34350 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34360 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67  )==0) ){.    pag
34370 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
34380 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
34390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
343a0 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  ge getter method
343b0 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61 63  s each try to ac
343c0 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
343d0 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77  e to a.** page w
343e0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ith page number 
343f0 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71  pgno. If the req
34400 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
34410 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
34420 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
34430 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
34440 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
34450 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
34460 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64  *.** There are d
34470 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65  ifferent impleme
34480 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
34490 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65  getter method de
344a0 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  pending.** on th
344b0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
344c0 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  of the pager..**
344d0 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e  .**     getPageN
344e0 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20  ormal()         
344f0 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67  --  The normal g
34500 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74  etter.**     get
34510 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20 20  PageError()     
34520 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66       --  Used if
34530 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
34540 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a   an error state.
34550 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d  **     getPageMm
34560 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20 2d  ap()           -
34570 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72  -  Used if memor
34580 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20  y-mapped I/O is 
34590 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66  enabled.**.** If
345a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
345b0 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
345c0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
345d0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
345e0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
345f0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
34600 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
34610 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
34620 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
34630 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34640 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
34650 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
34660 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
34670 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
34680 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
34690 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
346a0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
346b0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
346c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
346d0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
346e0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
346f0 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
34700 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
34710 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
34720 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
34730 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
34740 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
34750 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
34760 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
34770 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
34780 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
34790 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
347a0 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
347b0 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
347c0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
347d0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
347e0 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
347f0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
34800 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
34810 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
34820 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
34830 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20  f .** the flags 
34840 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
34850 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  ns the PAGER_GET
34860 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61  _NOCONTENT bit a
34870 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
34880 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
34890 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
348a0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
348b0 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
348c0 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
348d0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
348e0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
348f0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
34900 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
34910 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
34920 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45  *.** If PAGER_GE
34930 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74  T_NOCONTENT is t
34940 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
34950 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
34960 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
34970 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
34980 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
34990 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
349a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
349b0 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
349c0 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
349d0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
349e0 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
349f0 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
34a00 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
34a10 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
34a20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
34a30 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
34a40 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
34a50 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
34a60 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
34a70 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
34a80 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
34a90 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45  l..**.** If PAGE
34aa0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
34ab0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
34ac0 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
34ad0 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
34ae0 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65  d.** of being re
34af0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
34b00 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
34b10 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
34b20 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
34b30 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
34b40 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
34b50 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
34b60 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
34b70 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
34b80 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
34b90 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
34ba0 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
34bb0 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
34bc0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
34bd0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
34be0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
34bf0 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
34c00 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
34c10 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
34c20 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
34c30 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
34c40 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
34c50 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
34c60 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
34c70 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
34c80 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
34c90 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
34ca0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
34cb0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
34cc0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
34cd0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
34ce0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
34cf0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
34d00 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
34d10 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
34d20 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
34d30 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
34d40 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
34d50 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
34d60 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
34d70 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
34d80 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
34d90 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
34da0 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
34db0 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
34dc0 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
34dd0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
34de0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
34df0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
34e00 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
34e10 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
34e20 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
34e30 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
34e40 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
34e50 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
34e60 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
34e70 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
34e80 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
34e90 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
34ea0 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
34eb0 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
34ec0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73  rnal files..*/.s
34ed0 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
34ee0 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72  eNormal(.  Pager
34ef0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
34f00 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
34f10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34f20 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
34f30 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
34f40 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
34f50 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
34f60 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
34f70 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
34f80 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
34f90 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
34fa0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
34fb0 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
34fc0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
34fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34fe0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
34ff0 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20  u8 noContent;   
35000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35010 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45 52  /* True if PAGER
35020 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
35030 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74  s set */.  sqlit
35040 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
35050 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74  pBase;..  assert
35060 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
35070 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
35080 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35090 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
350a0 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
350b0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
350c0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
350d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
350e0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
350f0 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69  dLock==1 );..  i
35100 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
35110 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
35120 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65  PT_BKPT;.  pBase
35130 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
35140 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
35150 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
35160 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20  .  if( pBase==0 
35170 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
35180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35190 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
351a0 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
351b0 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29  e, pgno, &pBase)
351c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
351d0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
351e0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
351f0 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 3d  ;.    if( pBase=
35200 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
35210 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
35220 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
35230 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
35250 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
35260 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
35270 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
35280 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
35290 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ase);.  assert( 
352a0 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29  pPg==(*ppPage) )
352b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
352c0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
352d0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
352e0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
352f0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
35300 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d  ;..  noContent =
35310 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
35320 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d  GET_NOCONTENT)!=
35330 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  0;.  if( pPg->pP
35340 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
35350 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
35360 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
35370 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
35380 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
35390 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
353a0 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
353b0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
353c0 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
353d0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
353e0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
353f0 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
35400 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
35410 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
35420 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
35430 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
35440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
35450 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
35460 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
35470 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
35480 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
35490 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
354a0 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
354b0 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65  . But first some
354c0 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20   error checks:. 
354d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29     **.    ** (1)
354e0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
354f0 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
35500 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65  .    ** (2) Neve
35510 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74  r try to fetch t
35520 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a  he locking page.
35530 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
35540 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
35550 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
35560 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
35570 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
35580 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35590 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
355a0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
355b0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  r;.    }..    pP
355c0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
355d0 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  er;..    assert(
355e0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
355f0 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29  >fd) || !MEMDB )
35600 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
35610 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
35620 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
35630 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
35640 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
35650 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
35660 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
35670 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
35680 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
35690 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
356a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
356b0 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
356c0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
356d0 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
356e0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
356f0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
35700 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
35710 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
35720 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
35730 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
35740 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
35750 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
35760 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
35770 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
35780 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
35790 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
357a0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
357b0 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
357c0 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
357d0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
357e0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
357f0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
35800 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
35810 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35820 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
35830 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
35840 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
35850 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
35860 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
35870 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
35880 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
35890 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
358a0 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
358b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
358c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
358d0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
358e0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
358f0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
35900 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
35910 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
35920 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
35930 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35940 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35950 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
35960 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
35970 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
35980 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
35990 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
359a0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
359b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
359c0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
359d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
359e0 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  iFrame = 0;     
359f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
35a00 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f  rame to read fro
35a10 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  m WAL file */.  
35a20 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
35a30 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
35a40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35a50 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
35a60 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
35a70 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
35a80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
35a90 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
35aa0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35ac0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
35ad0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
35ae0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
35af0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  at[PAGER_STAT_MI
35b00 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  SS]++;.      rc 
35b10 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
35b20 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
35b30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35b40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
35b50 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
35b60 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
35b70 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
35b80 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
35b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
35ba0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
35bb0 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
35bc0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
35bd0 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
35be0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
35bf0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
35c00 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
35c10 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
35c20 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  r);.  *ppPage = 
35c30 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
35c40 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
35c50 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
35c60 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72   The page getter
35c70 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f 72 79   for when memory
35c80 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65  -mapped I/O is e
35c90 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63  nabled */.static
35ca0 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70   int getPageMMap
35cb0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
35cc0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
35cd0 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
35ce0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
35cf0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
35d00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35d10 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
35d20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
35d30 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
35d40 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
35d50 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
35d60 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
35d70 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
35d80 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
35d90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35da0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
35db0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32   *pPg = 0;.  u32
35dc0 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20   iFrame = 0;    
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35de0 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72  Frame to read fr
35df0 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 0a  om WAL file */..
35e00 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70    /* It is accep
35e10 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72  table to use a r
35e20 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20  ead-only (mmap) 
35e30 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67  page for any pag
35e40 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61  e except.  ** pa
35e50 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73  ge 1 if there is
35e60 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
35e70 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68  ction open or th
35e80 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e  e ACQUIRE_READON
35e90 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73  LY.  ** flag was
35ea0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
35eb0 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f  e caller. And so
35ec0 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20   long as the db 
35ed0 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74  is not a .  ** t
35ee0 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
35ef0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
35f00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
35f10 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e  bMmapOk = (pgno>
35f20 31 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  1.   && (pPager-
35f30 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
35f40 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20  EADER || (flags 
35f50 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  & PAGER_GET_READ
35f60 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20 20 61  ONLY)).  );..  a
35f70 73 73 65 72 74 28 20 55 53 45 46 45 54 43 48 28  ssert( USEFETCH(
35f80 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 64 65  pPager) );.#ifde
35f90 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
35fa0 45 43 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  EC.  assert( pPa
35fb0 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ger->xCodec==0 )
35fc0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  ;.#endif..  /* O
35fd0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65  ptimization note
35fe0 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20 22 70  :  Adding the "p
35ff0 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65 66  gno<=1" term bef
36000 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65  ore "pgno==0" he
36010 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74  re.  ** allows t
36020 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  he compiler opti
36030 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20 74  mizer to reuse t
36040 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
36050 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20  e "pgno>1".  ** 
36060 74 65 73 74 20 69 6e 20 74 68 65 20 70 72 65 76  test in the prev
36070 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c 20  ious statement, 
36080 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69 6e  and avoid testin
36090 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65  g pgno==0 in the
360a0 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73  .  ** common cas
360b0 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73 20  e where pgno is 
360c0 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  large. */.  if( 
360d0 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d  pgno<=1 && pgno=
360e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
360f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
36100 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
36110 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36120 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
36130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
36140 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
36150 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
36160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61  sert( pPager->ha
36170 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d  sHeldSharedLock=
36180 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
36190 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
361a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
361b0 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
361c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
361d0 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
361e0 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
361f0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
36200 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  , pgno, &iFrame)
36210 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
36220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36230 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
36240 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36250 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62     }.  }.  if( b
36260 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65  MmapOk && iFrame
36270 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  ==0 ){.    void 
36280 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  *pData = 0;.    
36290 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65  rc = sqlite3OsFe
362a0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
362b0 0a 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70  .        (i64)(p
362c0 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
362d0 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65  >pageSize, pPage
362e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44  r->pageSize, &pD
362f0 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ata.    );.    i
36300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36310 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20   && pData ){.   
36320 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
36330 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44  State>PAGER_READ
36340 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  ER || pPager->te
36350 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
36360 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
36370 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
36380 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
36390 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  }.      if( pPg=
363a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
363b0 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 4d   = pagerAcquireM
363c0 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  apPage(pPager, p
363d0 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67  gno, pData, &pPg
363e0 29 3b 0a 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  );.     }else{. 
363f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
36400 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
36410 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
36420 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
36430 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
36440 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
36450 67 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  g ){.        ass
36460 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
36470 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  OK );.        *p
36480 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20  pPage = pPg;.   
36490 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
364a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
364b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
364c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
364d0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
364e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
364f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
36500 74 75 72 6e 20 67 65 74 50 61 67 65 4e 6f 72 6d  turn getPageNorm
36510 61 6c 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  al(pPager, pgno,
36520 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
36530 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
36540 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
36550 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20 70  E>0 */../* The p
36560 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f  age getter metho
36570 64 20 66 6f 72 20 77 68 65 6e 20 74 68 65 20 70  d for when the p
36580 61 67 65 72 20 69 73 20 61 6e 20 65 72 72 6f 72  ager is an error
36590 20 73 74 61 74 65 20 2a 2f 0a 73 74 61 74 69 63   state */.static
365a0 20 69 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f   int getPageErro
365b0 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
365c0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
365d0 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
365e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
365f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
36600 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
36610 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
36620 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
36630 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
36640 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
36650 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
36660 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
36670 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
36680 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
36690 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
366a0 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b 0a 20 20  AMETER(pgno);.  
366b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
366c0 28 66 6c 61 67 73 29 3b 0a 20 20 61 73 73 65 72  (flags);.  asser
366d0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
366e0 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
366f0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
36700 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
36710 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a  >errCode;.}.../*
36720 20 44 69 73 70 61 74 63 68 20 61 6c 6c 20 70 61   Dispatch all pa
36730 67 65 20 66 65 74 63 68 20 72 65 71 75 65 73 74  ge fetch request
36740 73 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  s to the appropr
36750 69 61 74 65 20 67 65 74 74 65 72 20 6d 65 74 68  iate getter meth
36760 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  od..*/.int sqlit
36770 65 33 50 61 67 65 72 47 65 74 28 0a 20 20 50 61  e3PagerGet(.  Pa
36780 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
36790 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
367a0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
367b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
367c0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
367d0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
367e0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
367f0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
36800 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
36810 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
36820 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
36830 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
36840 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
36850 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 23 69 66   flags */.){.#if
36860 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45  def SQLITE_SERVE
36870 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20  R_EDITION.  if( 
36880 70 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50  pagerIsServer(pP
36890 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  ager) ){.    int
368a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 72   rc = sqlite3Ser
368b0 76 65 72 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  verLock(pPager->
368c0 70 53 65 72 76 65 72 2c 20 70 67 6e 6f 2c 20 30  pServer, pgno, 0
368d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
368e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
368f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
36900 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 50 61  dif.  return pPa
36910 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72  ger->xGet(pPager
36920 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
36930 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  flags);.}../*.**
36940 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
36950 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
36960 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
36970 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
36980 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
36990 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
369a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
369b0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
369c0 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
369d0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
369e0 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f   .**.** See also
369f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
36a00 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
36a10 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
36a20 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
36a30 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36a40 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
36a50 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
36a60 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
36a70 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
36a80 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
36a90 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
36aa0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
36ab0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
36ac0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
36ad0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
36ae0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
36af0 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
36b00 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
36b10 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
36b20 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
36b30 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
36b40 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61  ){.  sqlite3_pca
36b50 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b  che_page *pPage;
36b60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36b70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
36b80 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61  ( pgno!=0 );.  a
36b90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
36ba0 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70  PCache!=0 );.  p
36bb0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Page = sqlite3Pc
36bc0 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
36bd0 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
36be0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
36bf0 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Page==0 || pPage
36c00 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
36c10 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50  Lock );.  if( pP
36c20 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
36c30 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  0;.  return sqli
36c40 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
36c50 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
36c60 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67  ache, pgno, pPag
36c70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  e);.}../*.** Rel
36c80 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65  ease a page refe
36c90 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rence..**.** If 
36ca0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
36cb0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
36cc0 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
36cd0 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
36ce0 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
36cf0 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
36d00 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
36d10 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
36d20 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
36d30 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
36d40 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
36d50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36d60 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
36d70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
36d80 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
36d90 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
36da0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
36db0 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20   assert( pPg!=0 
36dc0 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50  );.  pPager = pP
36dd0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
36de0 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47   pPg->flags & PG
36df0 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20  HDR_MMAP ){.    
36e00 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
36e10 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73  age(pPg);.  }els
36e20 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  e{.    sqlite3Pc
36e30 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
36e40 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
36e50 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
36e60 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  er);.}.void sqli
36e70 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
36e80 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
36e90 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50  ( pPg ) sqlite3P
36ea0 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
36eb0 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
36ec0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
36ed0 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
36ee0 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
36ef0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
36f00 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
36f10 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
36f20 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
36f30 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
36f40 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
36f50 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
36f60 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
36f70 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
36f80 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
36f90 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
36fa0 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
36fb0 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
36fc0 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
36fd0 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
36fe0 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
36ff0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
37000 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
37010 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
37020 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
37030 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
37040 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
37050 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
37060 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
37070 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
37080 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
37090 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
370a0 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
370b0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
370c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
370d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
370e0 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
370f0 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
37100 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
37110 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
37120 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
37130 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
37140 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
37150 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
37160 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
37170 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
37180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37190 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
371a0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
371b0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
371c0 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
371d0 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
371e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
371f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
37200 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
37210 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
37220 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
37230 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
37240 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
37250 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
37260 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
37270 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
37280 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
37290 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
372a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
372b0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
372c0 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
372d0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
372e0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
372f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
37300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37310 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
37320 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
37330 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
37340 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
37350 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
37360 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
37370 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
37380 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37390 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
373a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
373b0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
373c0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
373d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
373e0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
373f0 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
37400 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
37410 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
37420 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
37430 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
37440 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
37450 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
37460 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
37470 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
37480 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
37490 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
374a0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
374b0 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
374c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
374d0 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
374e0 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
374f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
37500 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
37510 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70  ODE_OFF ){.    p
37520 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37530 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
37540 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
37550 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  dbSize);.    if(
37560 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37570 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
37580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
37590 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
375a0 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
375b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
375c0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
375d0 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
375e0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
375f0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
37600 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
37610 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
37620 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
37630 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
37640 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
37650 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
37660 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
37670 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  {.        int fl
37680 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
37690 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
376a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
376b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69          int nSpi
376c0 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ll;..        if(
376d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
376e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  e ){.          f
376f0 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
37700 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
37710 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
37720 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  EMP_JOURNAL);.  
37730 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d          nSpill =
37740 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
37750 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20  StmtSpill;.     
37760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37770 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
37780 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
37790 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
377a0 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75   nSpill = jrnlBu
377b0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
377c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
377d0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f        .        /
377e0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
377f0 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c  e database still
37800 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
37810 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65  me as it did whe
37820 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  n.        ** it 
37830 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  was originally o
37840 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  pened. */.      
37850 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49    rc = databaseI
37860 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29  sUnmoved(pPager)
37870 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37890 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
378a0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
378b0 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   (.             
378c0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
378d0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
378e0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70  >jfd, flags, nSp
378f0 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ill.          );
37900 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37910 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
37920 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
37930 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
37940 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20  >jfd) );.    }. 
37950 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   .  .    /* Writ
37960 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
37970 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
37980 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
37990 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  nd open .    ** 
379a0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
379b0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
379c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
379d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
379e0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
379f0 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
37a00 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
37a10 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
37a20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
37a30 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
37a40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
37a50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
37a60 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
37a70 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
37a80 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
37a90 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
37aa0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
37ab0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
37ac0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37ad0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
37ae0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
37af0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
37b00 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
37b10 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65  ournal = 0;.  }e
37b20 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
37b30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37b40 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37b50 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  CKED );.    pPag
37b60 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
37b70 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37b80 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
37b90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
37ba0 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
37bb0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
37bc0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
37bd0 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
37be0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37bf0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
37c00 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
37c10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
37c20 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
37c30 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
37c40 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
37c50 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
37c60 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
37c70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
37c80 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
37c90 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
37ca0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
37cb0 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
37cc0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
37cd0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
37ce0 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
37cf0 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
37d00 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
37d10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
37d20 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
37d30 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
37d40 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
37d50 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
37d60 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
37d70 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
37d80 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
37d90 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
37da0 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
37db0 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
37dc0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
37dd0 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
37de0 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
37df0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
37e00 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
37e10 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
37e20 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
37e30 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
37e40 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
37e50 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
37e60 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
37e70 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
37e80 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
37e90 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
37ea0 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
37eb0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
37ec0 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
37ed0 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
37ee0 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
37ef0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37f00 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
37f10 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
37f20 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
37f30 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
37f40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
37f50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
37f60 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70  rCode ) return p
37f70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37f80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37f90 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
37fa0 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
37fb0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45  ->eState<PAGER_E
37fc0 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72  RROR );.  pPager
37fd0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
37fe0 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
37ff0 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  y;..  if( ALWAYS
38000 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
38010 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29  =PAGER_READER) )
38020 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
38030 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
38040 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
38050 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
38060 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
38070 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
38080 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
38090 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
380a0 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
380b0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
380c0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
380d0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
380e0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
380f0 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
38100 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
38110 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
38120 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
38130 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
38140 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
38150 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
38160 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
38170 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
38180 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
38190 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
381a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
381b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
381c0 20 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f 69    }.        (voi
381d0 64 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  d)sqlite3WalExcl
381e0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
381f0 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20  ->pWal, 1);.    
38200 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72    }..      /* Gr
38210 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ab the write loc
38220 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  k on the log fil
38230 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
38240 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20  , upgrade to.   
38250 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45     ** PAGER_RESE
38260 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65  RVED state. Othe
38270 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
38280 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
38290 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
382a0 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e   ** The busy-han
382b0 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f  dler is not invo
382c0 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63  ked if another c
382d0 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64  onnection alread
382e0 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73  y.      ** holds
382f0 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e   the write-lock.
38300 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   If possible, th
38310 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
38320 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20  ll call it..    
38330 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
38340 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57  sqlite3WalBeginW
38350 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
38360 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
38370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
38380 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
38390 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
383a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
383b0 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
383c0 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a  rameter.      **
383d0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
383e0 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61  mmediately upgra
383f0 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58  de this to an EX
38400 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
38410 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d  e.      ** busy-
38420 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
38430 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
38440 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
38450 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
38460 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20     ** lock, but 
38470 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69  not when obtaini
38480 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ng the RESERVED 
38490 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
384a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
384b0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
384c0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
384d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
384e0 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20  TE_OK && exFlag 
384f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38500 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
38510 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
38520 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
38530 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
38540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38550 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61   ){.      /* Cha
38560 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f  nge to WRITER_LO
38570 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20  CKED state..    
38580 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41    **.      ** WA
38590 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65  L mode sets Page
385a0 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45  r.eState to PAGE
385b0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
385c0 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  or CACHEMOD.    
385d0 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73    ** when it has
385e0 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
385f0 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20  tion, but never 
38600 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49  to DBMOD or FINI
38610 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54  SHED..      ** T
38620 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
38630 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20 74  n those states t
38640 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20  he code to roll 
38650 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a  back savepoint .
38660 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
38670 74 69