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

Artifact e48554539fbeafc21036d7b4bd2101dfffca2af9:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73  f.};../*.** Bits
5240: 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f   of the Pager.do
5250: 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20  NotSpill flag.  
5260: 53 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63  See further desc
5270: 72 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a  ription below..*
5280: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5290: 4c 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20  LAG_OFF         
52a0: 30 78 30 31 20 20 20 20 20 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 20 20 20 20 20 2f 2a 20 43 75   0x02      /* Cu
5300: 72 72 65 6e 74 20 72 6f 6c 6c 69 6e 67 20 62 61  rrent rolling ba
5310: 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 73 70  ck, so do not sp
5320: 69 6c 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ill */.#define S
5330: 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
5340: 20 20 20 20 20 30 78 30 34 20 20 20 20 20 20 2f       0x04      /
5350: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5360: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5370: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  /../*.** A open 
5380: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
5390: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
53a0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
53b0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
53c0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
53d0: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
53e0: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
53f0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5400: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5410: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5420: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5430: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5440: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5450: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5460: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
5470: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
5480: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
5490: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
54a0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
54b0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
54c0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
54d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
54e0: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
54f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5500: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5510: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5520: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5530: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5540: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5550: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5560: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
5570: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
5580: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
5590: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
55a0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
55b0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
55c0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
55d0: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
55e0: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
55f0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5600: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5610: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5620: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5630: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5640: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5650: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5660: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
5670: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
5680: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
5690: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
56a0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
56b0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
56c0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
56d0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
56e0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
56f0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5700: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5710: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5720: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5730: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5740: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5750: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5760: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5770: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
5780: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
5790: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
57a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
57b0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
57c0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
57d0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
57e0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
57f0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5800: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5810: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5820: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5830: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5840: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5870: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5880: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5890: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
58a0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
58b0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
58c0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
58d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
58e0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
58f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5900: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5910: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5920: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5930: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5940: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5950: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5960: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5970: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5990: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
59a0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
59b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
59c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
59d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
59e0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
59f0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5a00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5a10: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5a20: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5a30: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5a40: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5a50: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5a60: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5a70: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5a80: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5a90: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5aa0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ab0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5ac0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5ad0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5ae0: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5af0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5b00: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5b10: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5b20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5b40: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5b50: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5b60: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5b70: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5b80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5b90: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5ba0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5bb0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5bc0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5bd0: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5be0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5bf0: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5c00: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5c10: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5c20: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5c30: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5c40: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5c50: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5c60: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5c70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5c80: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5c90: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ca0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5cb0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5cc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5cd0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5ce0: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5cf0: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5d00: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5d10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5d20: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5d30: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5d40: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5d50: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5d60: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5d70: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5d80: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5d90: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5da0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5db0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5dc0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
5dd0: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
5de0: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
5df0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
5e00: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
5e10: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
5e20: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
5e30: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
5e40: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
5e50: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
5e60: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
5e70: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
5e80: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
5e90: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
5ea0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
5eb0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ec0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
5ed0: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5ee0: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
5ef0: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
5f00: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
5f10: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
5f20: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
5f30: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
5f40: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
5f50: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
5f60: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
5f70: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
5f80: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
5f90: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
5fa0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
5fb0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
5fc0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5fd0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5fe0: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
5ff0: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6000: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6010: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6020: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6030: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6040: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6050: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6060: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
6070: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
6080: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
6090: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
60a0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
60b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
60c0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
60d0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
60e0: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
60f0: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6100: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6110: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6120: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6130: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6140: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6150: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6160: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
6170: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
6180: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
6190: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
61a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
61b0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
61c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
61d0: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
61e0: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
61f0: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6200: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6210: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6220: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6230: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6240: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6250: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6260: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
6270: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
6280: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
6290: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20  e database from 
62a0: 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
62b0: 20 20 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c     is permitted,
62c0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
62d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
62e0: 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61 67 20   not. This flag 
62f0: 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79 20 73  is set.**   by s
6300: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6310: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6320: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6330: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
6340: 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61  an.**   the data
6350: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6360: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
6370: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
6380: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
6390: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
63a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63b0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63c0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63d0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63e0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
63f0: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6400: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6410: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6420: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6430: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6440: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6460: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6470: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6480: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
6490: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64a0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64c0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64d0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64e0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
64f0: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6500: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6510: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6520: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6530: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6540: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6550: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6570: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6580: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
6590: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65a0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65b0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65c0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65d0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65e0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
65f0: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6600: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6610: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6620: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6630: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6640: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6650: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6660: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6670: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6680: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
6690: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66a0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66c0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66d0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66e0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
66f0: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6700: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6710: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6720: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6730: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6740: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6750: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6760: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6770: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6780: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
6790: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67a0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67c0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67d0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67e0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
67f0: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6800: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6810: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6820: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6830: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6840: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6850: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6860: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6870: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6880: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
6890: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68b0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68c0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68d0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68e0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
68f0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6900: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6910: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6920: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6930: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6940: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6950: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6960: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6970: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6980: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
6990: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69b0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69c0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
69f0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a00: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a10: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a30: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a50: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a60: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a70: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a80: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6a90: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6aa0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ab0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ac0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ad0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6ae0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6af0: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b00: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b10: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b20: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b30: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b40: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b50: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b60: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b70: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b80: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6b90: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6ba0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bb0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bc0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6bd0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6be0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6bf0: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c00: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c10: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c20: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c30: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c40: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c50: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c60: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c70: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c80: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6c90: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6ca0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cb0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6cd0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6ce0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6cf0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d00: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d10: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d30: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d40: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d50: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d60: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d70: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d80: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6d90: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6da0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6db0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dc0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6dd0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6de0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6df0: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e00: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e10: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e20: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e30: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e40: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e50: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e60: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e70: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e80: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6e90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6ea0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6eb0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ec0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ed0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ee0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6ef0: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f00: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f10: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f20: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f30: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f40: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f50: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f60: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f70: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f80: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6f90: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fa0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fb0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fc0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fd0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6fe0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
6ff0: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7000: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7010: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7020: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7030: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7040: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7050: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7060: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7070: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7080: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
7090: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70a0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70b0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70c0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70d0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70e0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
70f0: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7100: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7120: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7130: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7140: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7150: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7160: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7170: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7180: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
7190: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71a0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71b0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71c0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71d0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
71f0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7200: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7210: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7220: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7230: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7240: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7250: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7260: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
7290: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72a0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72b0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72c0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72d0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72e0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
72f0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ess */.  u8 ckpt
7300: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7310: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7320: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7330: 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20   for checkpoint 
7340: 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46  */.  u8 walSyncF
7350: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7360: 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   /* SYNC_NORMAL 
7370: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72  or SYNC_FULL for
7380: 20 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20   wal writes */. 
7390: 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20   u8 syncFlags;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
73c0: 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69  YNC_FULL otherwi
73d0: 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  se */.  u8 tempF
73e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
73f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
7400: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
7410: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
7420: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
7430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7440: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7450: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7460: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7470: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7480: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7490: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
74a0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
74b0: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
74c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
74d0: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
74e0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
74f0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7540: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7550: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7560: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7570: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7580: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7590: 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61  e opertion.  Cla
75a0: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
75b0: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
75c0: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
75d0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
75e0: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
75f0: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
7600: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
7610: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
7620: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
7630: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7640: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7650: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7660: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
7670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
7680: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
7690: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
76a0: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
76b0: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
76c0: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
76d0: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
76e0: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
76f0: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
7700: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
7710: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
7720: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
7730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7740: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7750: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7760: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
7770: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
7780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7790: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
77a0: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
77b0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
77c0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
77d0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
77e0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
77f0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
7800: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
7810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7820: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
7830: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7840: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7850: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7860: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7870: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7880: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7890: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
78a0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20  subjInMemory;   
78b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
78c0: 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72   to use in-memor
78d0: 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  y sub-journals *
78e0: 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b  /.  Pgno dbSize;
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
7910: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
7920: 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f  se */.  Pgno dbO
7930: 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rigSize;        
7940: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
7950: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
7960: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
7970: 20 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a    Pgno dbFileSiz
7980: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7990: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
79a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
79b0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
79c0: 64 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20  dbHintSize;     
79d0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
79e0: 70 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f  passed to FCNTL_
79f0: 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a  SIZE_HINT call *
7a00: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
7a30: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
7a40: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  s */.  int nRec;
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72     /* Pages jour
7a70: 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73  nalled since las
7a80: 74 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74  t j-header writt
7a90: 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  en */.  u32 cksu
7aa0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
7ab0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
7ac0: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
7ad0: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
7ae0: 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52  m */.  u32 nSubR
7af0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
7b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7b10: 72 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20  records written 
7b20: 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  to sub-journal *
7b30: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a  /.  Bitvec *pInJ
7b40: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7b50: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
7b60: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
7b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7b80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7b90: 2a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *fd;           /
7ba0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7bb0: 72 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a  r for database *
7bc0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
7bd0: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
7be0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
7bf0: 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72  or for main jour
7c00: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
7c10: 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20  _file *sjfd;    
7c20: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7c30: 63 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d  criptor for sub-
7c40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
7c50: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
7c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
7c70: 65 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74  ent write offset
7c80: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
7c90: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
7ca0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
7cb0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
7cc0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
7cd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
7ce0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
7cf0: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
7d00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
7d10: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
7d20: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
7d30: 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  */.  PagerSavepo
7d40: 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b  int *aSavepoint;
7d50: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74   /* Array of act
7d60: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a  ive savepoints *
7d70: 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  /.  int nSavepoi
7d80: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
7d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
7da0: 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f  ments in aSavepo
7db0: 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20  int[] */.  char 
7dc0: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
7dd0: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
7de0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
7df0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
7e00: 20 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65   */..  u8 bUseFe
7e10: 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
7e20: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
7e30: 65 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20  e xFetch() */.  
7e40: 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20  int nMmapOut;   
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7e60: 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61  umber of mmap pa
7e70: 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75  ges currently ou
7e80: 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73  tstanding */.  s
7e90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
7ea0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  map;       /* De
7eb0: 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d  sired maximum mm
7ec0: 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48  ap size */.  PgH
7ed0: 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73  dr *pMmapFreelis
7ee0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t;       /* List
7ef0: 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61   of free mmap pa
7f00: 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72  ge headers (pDir
7f10: 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ty) */.  /*.  **
7f20: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
7f30: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
7f40: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
7f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
7fa0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
7fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7fc0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
7fd0: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
7fe0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
7ff0: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
8000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8010: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8020: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
8030: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
8040: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
8050: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
8060: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
8070: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
8080: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
80a0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
80b0: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
80c0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
80d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
80e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
80f0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
8100: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
8110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8120: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
8130: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
8140: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
8150: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
8160: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
8170: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
8180: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
8190: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
81a0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
81b0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
81c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
81d0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
81e0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
81f0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8210: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
8220: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
8230: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8240: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
8250: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
8260: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
8270: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
8280: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
8290: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
82a0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
82b0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
82c0: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
82d0: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
82e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
82f0: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8320: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8330: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8340: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
8350: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
8360: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
8370: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
8380: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
8390: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
83a0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
83b0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
83c0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
83d0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
83e0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
83f0: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8400: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8410: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8420: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8430: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8440: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
8450: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
8460: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
8470: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
8480: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
8490: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
84a0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
84b0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
84c0: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
84d0: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
84e0: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
84f0: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8500: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8510: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8520: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8530: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8540: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
8550: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8560: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
8570: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
8580: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
8590: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
85a0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
85b0: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
85c0: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
85d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
85e0: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
85f0: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8600: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8610: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8620: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8630: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8640: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
8650: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
8660: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
8670: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
8680: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
8690: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
86a0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
86b0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
86c0: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
86d0: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
86e0: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
86f0: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8700: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8710: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8720: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8730: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8740: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
8750: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
8760: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
8770: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
8780: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
8790: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
87a0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
87b0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
87c0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
87d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
87e0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
87f0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8800: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8810: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8820: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8830: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8840: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
8850: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
8860: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8870: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
8880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8890: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
88a0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
88b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
88c0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
88d0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
88e0: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
88f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8900: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8910: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8920: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8930: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8940: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
8950: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
8960: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8970: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
8980: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
8990: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
89a0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
89b0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
89c0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
89d0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
89e0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
89f0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8a00: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8a10: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8a20: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8a30: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8a40: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
8a50: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
8a60: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
8a70: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
8a80: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
8a90: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
8aa0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8ab0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8ac0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8ad0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8ae0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8af0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8b00: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8b10: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8b20: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8b30: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8b40: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
8b50: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
8b60: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
8b70: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8b80: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
8b90: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8ba0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8bb0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8bc0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8bd0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8be0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8bf0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8c00: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8c10: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8c20: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8c30: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8c40: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
8c50: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
8c60: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
8c70: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
8c80: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
8c90: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
8ca0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8cb0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8cc0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8cd0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8ce0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8cf0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8d00: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8d10: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8d20: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8d30: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8d40: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8d50: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8d60: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8d70: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8d80: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8d90: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8da0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8db0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8dc0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8dd0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8de0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8df0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8e00: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8e10: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8e20: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8e30: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8e40: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8e50: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8e60: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8e70: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8e80: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8e90: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8ea0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
8eb0: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
8ec0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
8ed0: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
8ee0: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
8ef0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
8f00: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
8f10: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
8f20: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
8f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8f40: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
8f50: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
8f60: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
8f70: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
8f80: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
8f90: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
8fa0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
8fb0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
8fc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
8fd0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
8fe0: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
8ff0: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
9000: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
9010: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
9020: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
9030: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
9040: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
9050: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
9060: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
9070: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
9080: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
9090: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
90a0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
90b0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
90c0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
90d0: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
90e0: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
90f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
9100: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
9110: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
9120: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
9130: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
9140: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
9150: 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20  cro USEFETCH is 
9160: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
9170: 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68  llowed to use th
9180: 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e  e xFetch and xUn
9190: 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61  fetch.** interfa
91a0: 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ces to access th
91b0: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
91c0: 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49   memory-mapped I
91d0: 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  /O..*/.#if SQLIT
91e0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
91f0: 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  0.# define USEFE
9200: 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73  TCH(x) ((x)->bUs
9210: 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20  eFetch).#else.# 
9220: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9230: 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x) 0.#endif../*.
9240: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
9250: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
9260: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
9270: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
9280: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
9290: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
92a0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
92b0: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
92c0: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
92d0: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
92e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
92f0: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
9300: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
9310: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
9320: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
9330: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
9340: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
9350: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
9360: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
9370: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
9380: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
9390: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
93a0: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
93b0: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
93c0: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
93d0: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
93e0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
93f0: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
9400: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
9410: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
9420: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
9430: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
9440: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
9450: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
9460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
9470: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9480: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
9490: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
94a0: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
94b0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
94c0: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
94d0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
94e0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
94f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9500: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
9510: 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20  x,y) 0.# define 
9520: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9530: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9540: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9550: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
9560: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
9570: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
9580: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
9590: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
95a0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
95b0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
95c0: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
95d0: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
95e0: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
95f0: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9600: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9610: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9620: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9630: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9640: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9650: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
9660: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
9670: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
9680: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
9690: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
96a0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
96b0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
96c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
96d0: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
96e0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
96f0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9700: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9710: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9720: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9730: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9740: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9750: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
9760: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9770: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
9780: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9790: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
97a0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
97b0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
97c0: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
97d0: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
97e0: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
97f0: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9800: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9810: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9830: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9840: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9850: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
9860: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
9870: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
9880: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
9890: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
98a0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
98b0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
98c0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
98d0: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
98e0: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
98f0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9900: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9910: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9920: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9930: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9940: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9950: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9960: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
9970: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
9980: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
9990: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
99a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
99b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
99c0: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
99d0: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
99e0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
99f0: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
9a00: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
9a10: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
9a20: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
9a30: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
9a40: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
9a50: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
9a60: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
9a70: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
9a80: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
9a90: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
9aa0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
9ab0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
9ac0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
9ad0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
9ae0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
9af0: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
9b00: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
9b10: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
9b20: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
9b30: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
9b40: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
9b50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
9b60: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
9b70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9b80: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
9b90: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
9ba0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
9bb0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
9bc0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
9bd0: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
9be0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
9bf0: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
9c00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9c10: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61  >noSync );.    a
9c20: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9c30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9c40: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9c50: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
9c60: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9c70: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
9c80: 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  RY .    );.    a
9c90: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
9ca0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
9cb0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9cc0: 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73  R_OPEN );.    as
9cd0: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
9ce0: 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  l(p)==0 );.  }..
9cf0: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f    /* If changeCo
9d00: 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20  untDone is set, 
9d10: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9d20: 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
9d30: 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20  be held.  ** on 
9d40: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9d50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9d60: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
9d70: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
9d80: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9d90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9da0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49   p->eLock!=PENDI
9db0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77  NG_LOCK );..  sw
9dc0: 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20  itch( p->eState 
9dd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
9de0: 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73  R_OPEN:.      as
9df0: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9e00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9e10: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9e20: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9e30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9e40: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
9e50: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
9e60: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
9e70: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
9e80: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9e90: 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a  e PAGER_READER:.
9ea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9eb0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9ec0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9ed0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ee0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9ef0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9f00: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
9f10: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9f20: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9f30: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e PAGER_WRITER_L
9f40: 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73  OCKED:.      ass
9f50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9fa0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9fb0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9fc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fd0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
9fe0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
9ff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a000: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
a010: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a020: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a030: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a040: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a050: 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  FileSize );.    
a060: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a070: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a080: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a090: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a0a0: 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  ( pPager->setMas
a0b0: 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ter==0 );.      
a0c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a0d0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
a0e0: 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73  CHEMOD:.      as
a0f0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a100: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a120: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a130: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a140: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a150: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a160: 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70        /* It is p
a170: 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20  ossible that if 
a180: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a190: 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68   here that neith
a1a0: 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  er the.        *
a1b0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
a1c0: 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20  or the WAL file 
a1d0: 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68  are open. This h
a1e0: 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20  appens during.  
a1f0: 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62        ** a rollb
a200: 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
a210: 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72  that switches fr
a220: 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  om journal_mode=
a230: 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  off.        ** t
a240: 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77  o journal_mode=w
a250: 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  al..        */. 
a260: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a270: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a280: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a290: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a2a0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a2b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a2c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a2d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a2f0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a300: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a310: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20  DE_WAL .        
a320: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a330: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a340: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a350: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
a360: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a370: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a380: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
a390: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a3a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a3b0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  e PAGER_WRITER_D
a3c0: 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  BMOD:.      asse
a3d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a3e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a400: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a410: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a420: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a430: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a440: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a450: 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53  p->eLock>=EXCLUS
a460: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a470: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a480: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a490: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a4a0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a4b0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a4c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a4d0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a4e0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a4f0: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a500: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a510: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70  r->dbOrigSize<=p
a520: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
a530: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
a540: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a550: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
a560: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a570: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a580: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a590: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a5a0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a5b0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a5c0: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a5d0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a5f0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a600: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a610: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a620: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a630: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a640: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a650: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a660: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a680: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52    case PAGER_ERR
a690: 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  OR:.      /* The
a6a0: 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
a6b0: 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
a6c0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ing reference to
a6d0: 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20   the pager if.  
a6e0: 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20      ** in ERROR 
a6f0: 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
a700: 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   the pager shoul
a710: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
a720: 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20  ropped.      ** 
a730: 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
a740: 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
a750: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a760: 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
a770: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a780: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
a790: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
a7a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
a7b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a7c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b    }..  return 1;
a7d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
a7e0: 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23  def NDEBUG */..#
a7f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a800: 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UG ./*.** Return
a810: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a820: 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73  human readable s
a830: 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69  tring in a stati
a840: 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74  c buffer.** cont
a850: 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65  aining the state
a860: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
a870: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61  ject passed as a
a880: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  n argument. This
a890: 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20  .** is intended 
a8a0: 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69  to be used withi
a8b0: 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72  n debuggers. For
a8c0: 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20   example, as an 
a8d0: 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74  alternative.** t
a8e0: 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72  o "print *pPager
a8f0: 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20  " in gdb:.**.** 
a900: 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73  (gdb) printf "%s
a910: 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  ", print_pager_s
a920: 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a  tate(pPager).*/.
a930: 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69  static char *pri
a940: 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50  nt_pager_state(P
a950: 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74  ager *p){.  stat
a960: 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32  ic char zRet[102
a970: 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  4];..  sqlite3_s
a980: 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52  nprintf(1024, zR
a990: 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e  et,.      "Filen
a9a0: 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a  ame:      %s\n".
a9b0: 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20        "State:   
a9c0: 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65        %s errCode
a9d0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f  =%d\n".      "Lo
a9e0: 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c  ck:          %s\
a9f0: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e  n".      "Lockin
aa00: 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67  g mode:  locking
aa10: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
aa20: 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a    "Journal mode:
aa30: 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25    journal_mode=%
aa40: 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b  s\n".      "Back
aa50: 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46  ing store: tempF
aa60: 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20  ile=%d memDb=%d 
aa70: 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22  useJournal=%d\n"
aa80: 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a  .      "Journal:
aa90: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66         journalOf
aaa0: 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64  f=%lld journalHd
aab0: 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20  r=%lld\n".      
aac0: 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20  "Size:          
aad0: 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67  dbsize=%d dbOrig
aae0: 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69  Size=%d dbFileSi
aaf0: 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c  ze=%d\n".      ,
ab00: 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20   p->zFilename.  
ab10: 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d      , p->eState=
ab20: 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20  =PAGER_OPEN     
ab30: 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20         ? "OPEN" 
ab40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ab50: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
ab60: 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45  R          ? "RE
ab70: 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20  ADER" :.        
ab80: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ab90: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20  _WRITER_LOCKED  
aba0: 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45   ? "WRITER_LOCKE
abb0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
abc0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
abd0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20  ITER_CACHEMOD ? 
abe0: 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  "WRITER_CACHEMOD
abf0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac00: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ac10: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22  TER_DBMOD    ? "
ac20: 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a  WRITER_DBMOD" :.
ac30: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ac40: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
ac50: 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54  FINISHED ? "WRIT
ac60: 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20  ER_FINISHED" :. 
ac70: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ac80: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20  ==PAGER_ERROR   
ac90: 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52          ? "ERROR
aca0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
acb0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72      , (int)p->er
acc0: 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d  rCode.      , p-
acd0: 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
ace0: 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f          ? "NO_LO
acf0: 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  CK" :.        p-
ad00: 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
ad10: 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52  _LOCK   ? "RESER
ad20: 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  VED" :.        p
ad30: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
ad40: 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c  VE_LOCK  ? "EXCL
ad50: 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20  USIVE" :.       
ad60: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45   p->eLock==SHARE
ad70: 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48  D_LOCK     ? "SH
ad80: 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  ARED" :.        
ad90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  p->eLock==UNKNOW
ada0: 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b  N_LOCK    ? "UNK
adb0: 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f  NOWN" : "?error?
adc0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63  ".      , p->exc
add0: 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78  lusiveMode ? "ex
ade0: 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d  clusive" : "norm
adf0: 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  al".      , p->j
ae00: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ae10: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
ae20: 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79  MORY   ? "memory
ae30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ae40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ae50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
ae60: 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a  F      ? "off" :
ae70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
ae80: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ae90: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
aea0: 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a  E   ? "delete" :
aeb0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aec0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aed0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
aee0: 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20  ST  ? "persist" 
aef0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
af00: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af10: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
af20: 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65  CATE ? "truncate
af30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
af40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
af50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
af60: 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a  L      ? "wal" :
af70: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
af80: 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46   , (int)p->tempF
af90: 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d  ile, (int)p->mem
afa0: 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a  Db, (int)p->useJ
afb0: 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70  ournal.      , p
afc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d  ->journalOff, p-
afd0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
afe0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69    , (int)p->dbSi
aff0: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72  ze, (int)p->dbOr
b000: 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  igSize, (int)p->
b010: 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a  dbFileSize.  );.
b020: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
b030: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
b040: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
b050: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
b060: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
b070: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
b080: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
b090: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
b0a0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
b0b0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
b0c0: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
b0d0: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
b0e0: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
b0f0: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
b100: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b110: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
b120: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
b130: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
b140: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
b150: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
b160: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
b170: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
b180: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
b190: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
b1a0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
b1b0: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
b1c0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
b1d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
b1e0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
b1f0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
b200: 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  *p;.  Pgno pgno 
b210: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69  = pPg->pgno;.  i
b220: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
b230: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
b240: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
b250: 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53   p = &pPager->aS
b260: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
b270: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
b280: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
b290: 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70  3BitvecTest(p->p
b2a0: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
b2b0: 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  o) ){.      retu
b2c0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
b2d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
b2e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b2f0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
b300: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
b310: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
b320: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
b330: 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  nJournal(Pager *
b340: 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
b350: 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  Pg){.  return sq
b360: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
b370: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b380: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b390: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b3a0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b3b0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b3c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b3d0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b3e0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b3f0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b400: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b410: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b420: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b430: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b440: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b450: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b460: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b470: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b480: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b490: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b4a0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b4b0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b4c0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b4d0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b4e0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b4f0: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b500: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b510: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b520: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b530: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b540: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b550: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b560: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b570: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b580: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b590: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b5a0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b5b0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b5c0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b5d0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b5e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b5f0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b600: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b610: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b620: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b630: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b640: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b650: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b660: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b670: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b680: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b690: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b6a0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b6b0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b6c0: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b6d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b6e0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b6f0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b700: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b710: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b720: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b730: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b740: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b750: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b760: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b770: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b780: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b790: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b7a0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b7b0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b7c0: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b7d0: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b7e0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b7f0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b800: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b810: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b820: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b830: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b840: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b850: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b860: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b870: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b880: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b890: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b8a0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b8b0: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b8c0: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b8d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b8e0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b8f0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b900: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b910: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b920: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b930: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b940: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b960: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b970: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b980: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b990: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b9a0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b9b0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b9c0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b9d0: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
b9e0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
b9f0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
ba00: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
ba10: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
ba20: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
ba30: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
ba40: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
ba50: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
ba60: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
ba70: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
ba80: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
ba90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
baa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
bab0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bac0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
bad0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
bae0: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
baf0: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
bb00: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
bb10: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
bb20: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
bb30: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
bb40: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
bb50: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
bb60: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
bb70: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
bb80: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
bb90: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
bba0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
bbb0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
bbc0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
bbd0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
bbe0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bbf0: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
bc00: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
bc10: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
bc20: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
bc30: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
bc40: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
bc50: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
bc60: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
bc70: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
bc80: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
bc90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bca0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
bcb0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
bcc0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
bcd0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
bce0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bcf0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bd00: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
bd10: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
bd20: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
bd30: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
bd40: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bd50: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bd60: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
bd70: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
bd80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bd90: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
bda0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
bdb0: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
bdc0: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
bdd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
bde0: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
bdf0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
be00: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
be10: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
be20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
be30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
be40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
be50: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
be60: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
be70: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
be80: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
be90: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
bea0: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
beb0: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
bec0: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
bed0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bee0: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
bef0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
bf00: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
bf10: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
bf20: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
bf30: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
bf40: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
bf50: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
bf60: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
bf70: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
bf80: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
bf90: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
bfa0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
bfb0: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
bfc0: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
bfd0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
bfe0: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
bff0: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
c000: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
c010: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
c020: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
c030: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
c040: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
c050: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c060: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c070: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c080: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c090: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c0a0: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c0b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c0c0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c0d0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c0e0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c0f0: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c100: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c110: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c120: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c130: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c140: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c150: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c160: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c170: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c180: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c1b0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c1c0: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c1f0: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c200: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c220: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c230: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c240: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c250: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c260: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c270: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c280: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c290: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c2a0: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c2b0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c2c0: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c2d0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c2e0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c2f0: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c300: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c310: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c320: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c330: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c340: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c350: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c360: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c380: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c390: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c3a0: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c3b0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c3c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c3d0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
c3e0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
c3f0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
c400: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c410: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
c420: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
c430: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
c440: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c450: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
c460: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
c470: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c480: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
c490: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
c4a0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
c4b0: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
c4c0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c4d0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
c4e0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
c4f0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
c500: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
c510: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c520: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
c530: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
c540: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
c550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
c560: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
c570: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
c580: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c590: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
c5a0: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
c5b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c5c0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
c5d0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
c5e0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
c5f0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c600: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c610: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
c620: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c630: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
c640: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
c650: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
c660: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
c670: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
c680: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
c690: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
c6a0: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
c6b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c6c0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
c6d0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
c6e0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
c6f0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
c700: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
c710: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
c720: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
c730: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
c740: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
c750: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
c760: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
c770: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
c780: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
c790: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
c7a0: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
c7b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
c7c0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
c7d0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
c7e0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
c7f0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
c800: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
c810: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
c820: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
c830: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
c840: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
c850: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
c860: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
c870: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
c880: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
c890: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
c8a0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
c8b0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
c8c0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
c8d0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
c8e0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
c8f0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
c900: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
c910: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c920: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
c930: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
c940: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
c950: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
c960: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
c970: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
c980: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
c990: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
c9a0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
c9b0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
c9c0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
c9d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c9e0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
c9f0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
ca00: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
ca10: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
ca20: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
ca30: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
ca40: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
ca50: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
ca60: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
ca70: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
ca80: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
ca90: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
caa0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
cab0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
cac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
cad0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
cae0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
caf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
cb00: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
cb10: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
cb20: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
cb30: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
cb40: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
cb50: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
cb60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
cb70: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
cb80: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
cb90: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
cba0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cbb0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
cbc0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
cbd0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
cbe0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
cbf0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
cc00: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
cc10: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
cc20: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
cc30: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
cc40: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
cc50: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
cc60: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
cc70: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
cc80: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
cc90: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
cca0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ccb0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
ccc0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
ccd0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
cce0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
ccf0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
cd00: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
cd10: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
cd20: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
cd30: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
cd40: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
cd50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
cd60: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
cd70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
cd80: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
cd90: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
cda0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
cdd0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cdf0: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
ce00: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
ce10: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
ce20: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
ce30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
ce40: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
ce50: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
ce60: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
ce70: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
ce80: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
ce90: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
cea0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
ceb0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ced0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
cee0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
cef0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
cf00: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
cf10: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
cf20: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
cf30: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
cf40: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
cf50: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
cf60: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
cf70: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
cf80: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
cf90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
cfa0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
cfb0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
cfc0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
cfd0: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30  er .   || len==0
cfe0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
cff0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
d000: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
d010: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
d020: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d030: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d040: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
d050: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
d060: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
d070: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
d080: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d090: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d0a0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
d0b0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
d0c0: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
d0d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d0e0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
d0f0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
d100: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
d110: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
d120: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
d130: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
d140: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
d150: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
d160: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
d170: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
d180: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
d190: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
d1a0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
d1b0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
d1c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d1d0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
d1e0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
d1f0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
d200: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
d210: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
d220: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
d230: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
d240: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d250: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
d260: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
d270: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
d280: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
d290: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d2a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
d2b0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
d2c0: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
d2d0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
d2e0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
d2f0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
d300: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
d310: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
d320: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
d330: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
d340: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
d350: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
d360: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
d370: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
d380: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
d390: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
d3a0: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d3d0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d3f0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d460: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d470: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d480: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d490: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d4a0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d4b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d4c0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d4d0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d4e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d4f0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d500: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d510: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d520: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d530: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d540: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d550: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d560: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d570: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d580: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d590: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d5a0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d5b0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d5c0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d5d0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d5e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d5f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d600: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d610: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d620: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d630: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d640: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d650: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d660: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d670: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d680: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d690: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d6a0: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d6b0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d6c0: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d6d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d6e0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d6f0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d700: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d710: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d720: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d730: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d740: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d750: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d760: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d770: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d790: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d7a0: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d7b0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d7d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d7e0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d7f0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d800: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d810: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d820: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d830: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d840: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d850: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d860: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d870: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d880: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d890: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d8a0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d8b0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d8c0: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d8d0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d8e0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d8f0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d900: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d910: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d920: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
d930: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d940: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d950: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
d960: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
d970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
d990: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
d9a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d9b0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
d9c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d9d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
da00: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
da10: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
da20: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
da30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
da40: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
da50: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
da60: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
da70: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
da80: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
da90: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
daa0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
dab0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
dac0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
dad0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
dae0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
daf0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
db00: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
db10: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
db20: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
db30: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
db40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
db50: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
db60: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
db70: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
db80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
db90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
dba0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
dbb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
dbc0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
dbd0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
dbe0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
dbf0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
dc00: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
dc10: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
dc20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
dc30: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
dc40: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
dc50: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
dc60: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
dc70: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
dc80: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
dc90: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
dca0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
dcb0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
dcc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
dcd0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
dce0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
dcf0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
dd00: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
dd10: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
dd20: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
dd30: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
dd40: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
dd50: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
dd60: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
dd70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dd80: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
dd90: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
dda0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ddb0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
ddc0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
ddd0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
dde0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
ddf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
de00: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
de10: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
de20: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
de30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
de40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
de50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
de60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
de70: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
de80: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
de90: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
dea0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
deb0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
dec0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
ded0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
dee0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
def0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
df00: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
df10: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
df20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
df30: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
df40: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
df50: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
df60: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
df70: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
df80: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
df90: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
dfa0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dfb0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
dfc0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
dfd0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dfe0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
dff0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e000: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e010: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e020: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e030: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e040: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e050: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e060: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e070: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e080: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e090: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e0a0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e0b0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e0c0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e0d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e0e0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e100: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e110: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e120: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e130: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e140: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e150: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e160: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e170: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e180: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e190: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e1a0: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e1b0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e1e0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e1f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e200: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e220: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e230: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e240: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e250: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e260: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e270: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e280: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e290: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e2a0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e2b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e2c0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e2d0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e2e0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e2f0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e300: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e310: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e320: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e330: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e340: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e350: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e360: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e370: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
e380: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
e390: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
e3a0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
e3b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
e3c0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
e3d0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
e3e0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
e3f0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e400: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e410: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e420: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e430: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e440: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e450: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e460: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e470: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e480: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e490: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e4a0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e4b0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e4c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e4d0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e4e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e4f0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e500: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e510: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e520: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e530: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e540: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e550: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e560: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e570: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e580: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e590: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e5a0: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e5b0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e5c0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e5d0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e5e0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e5f0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e600: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e610: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e620: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e630: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e640: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e650: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e660: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e670: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e680: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e690: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e6a0: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e6b0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e6c0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e6d0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e6e0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e6f0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e700: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e710: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e720: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e730: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e740: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e750: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e760: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e770: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e780: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e790: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e7a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e7b0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e7c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e7d0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e7e0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e7f0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e800: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e810: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e820: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e830: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e840: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e850: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e860: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e880: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e890: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e8a0: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e8b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e8c0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e8d0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e8e0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e8f0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e900: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e910: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e920: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
e930: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
e940: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
e950: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
e960: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e970: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e980: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
e990: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
e9a0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
e9b0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
e9c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e9d0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
e9e0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
e9f0: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
ea00: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
ea10: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
ea20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ea30: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
ea40: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
ea50: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ea60: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ea70: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
ea80: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
ea90: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
eaa0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
eab0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
eac0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
ead0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
eae0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
eaf0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
eb00: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
eb10: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
eb20: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
eb30: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
eb40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
eb50: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
eb60: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
eb70: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
eb80: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb90: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eba0: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
ebb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
ebc0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
ebd0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
ebe0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
ebf0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
ec00: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
ec10: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
ec20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
ec30: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
ec40: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
ec50: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
ec60: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
ec70: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
ec80: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
ec90: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
eca0: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
ecb0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
ecc0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
ecd0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ece0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
ecf0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
ed00: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
ed10: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
ed20: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
ed30: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
ed40: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
ed50: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
ed60: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
ed70: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
ed80: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
ed90: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
eda0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
edb0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
edc0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
edd0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
ede0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
edf0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
ee00: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
ee10: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
ee20: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
ee30: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
ee40: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
ee50: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
ee60: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
ee70: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
ee80: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
ee90: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
eea0: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
eeb0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
eec0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
eed0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
eee0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
eef0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
ef00: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
ef10: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
ef20: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
ef30: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
ef40: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
ef50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
ef60: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
ef70: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
ef80: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
ef90: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
efa0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
efb0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
efc0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
efd0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
efe0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
eff0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f000: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f010: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f020: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f030: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f040: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f050: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f060: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f070: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f080: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f090: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f0a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f0b0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f0c0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f0d0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f0e0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f0f0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f100: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f110: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f120: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f130: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f140: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f150: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f160: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f170: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f180: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f1a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f1b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f1c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f1d0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f1e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f1f0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f200: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f210: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f220: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f230: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f240: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f250: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f260: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f270: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f280: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f290: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f2a0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f2b0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f2c0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f2d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f2e0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f2f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f300: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f310: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f320: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f330: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f340: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f350: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f360: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f370: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
f380: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
f390: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
f3a0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
f3b0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
f3c0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
f3d0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
f3e0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
f3f0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f400: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f410: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f420: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f430: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f440: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f450: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f460: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f470: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f480: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f490: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f4a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f4b0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f4c0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f4d0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f4e0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f4f0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f500: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f510: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f520: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f530: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f540: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f550: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f560: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f570: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f580: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f590: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f5a0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f5b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f5c0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f5d0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f5e0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f5f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f600: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f610: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f620: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f640: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f650: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f660: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f670: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f680: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f690: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f6a0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f6b0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f6c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f6d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f6e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f6f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f700: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f710: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f720: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f730: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f750: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f760: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f770: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f780: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f790: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f7a0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f7b0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f7c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f7d0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f7e0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f7f0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f800: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f820: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f830: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f840: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f850: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f870: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f880: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f890: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f8a0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f8b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f8c0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f8d0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f8e0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f8f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f900: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f910: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f920: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
f930: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
f940: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
f950: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
f960: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
f970: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
f980: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
f990: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
f9a0: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
f9b0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
f9c0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
f9d0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f9e0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
f9f0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
fa00: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
fa10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
fa20: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
fa30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fa40: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
fa50: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
fa60: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
fa70: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
fa80: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
fa90: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
faa0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fab0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
fac0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
fad0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
fae0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
faf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb00: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fb10: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
fb20: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
fb30: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
fb40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
fb50: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
fb60: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
fb70: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
fb80: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
fb90: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
fba0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
fbb0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
fbc0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
fbd0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
fbe0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
fbf0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fc00: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fc10: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fc20: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
fc30: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fc40: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc60: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
fc70: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
fc80: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fc90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fca0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fcb0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
fcc0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
fcd0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
fce0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
fcf0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
fd00: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fd20: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
fd30: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fd40: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
fd50: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
fd60: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
fd70: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
fd80: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
fd90: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
fda0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fdb0: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
fdc0: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
fdd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
fde0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fdf0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe00: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
fe10: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
fe20: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
fe30: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fe40: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fe50: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
fe60: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
fe70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fe80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fe90: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
fea0: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
feb0: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
fec0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
fed0: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
fee0: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
fef0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
ff00: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
ff10: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
ff20: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
ff30: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
ff40: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
ff50: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
ff60: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
ff70: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
ff80: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
ff90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
ffa0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
ffb0: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
ffc0: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
ffd0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
ffe0: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
fff0: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
10000 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10010 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
10020 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
10030 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
10040 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
10050 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
10060 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
10070 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10080 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10090 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
100a0 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
100b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
100c0 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
100f0 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
10100 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10110 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
10120 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
10130 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
10140 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
10150 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
10160 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
10170 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10180 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10190 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
101a0 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
101b0 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
101c0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
101d0 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
101e0 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
101f0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10200 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10210 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
10220 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
10230 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
10240 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
10250 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
10260 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
10270 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10280 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
102a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
102b0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
102c0 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
102d0 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
102e0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
102f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
10300 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10310 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
10320 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10330 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
10340 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
10350 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10360 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10370 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10380 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10390 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
103a0 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
103b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
103c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
103d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
103e0 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
103f0 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10400 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10410 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10420 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10430 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10440 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10450 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10460 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10470 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10480 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10490 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
104a0 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
104b0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
104c0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
104d0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
104e0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
104f0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10500 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10510 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10520 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10530 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10540 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10550 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10560 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10570 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10590 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
105a0 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
105b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
105c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
105d0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
105e0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
105f0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10600 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10610 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10620 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10630 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10640 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10650 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10660 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10670 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10680 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10690 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
106a0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
106b0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
106c0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
106d0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
106e0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
106f0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10700 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10710 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10720 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10730 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10740 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10750 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10760 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10770 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10780 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10790 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
107a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
107b0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
107c0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
107d0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
107e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
107f0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10800 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10810 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10820 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10830 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10840 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10850 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10860 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10870 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10880 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10890 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
108a0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
108b0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
108c0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
108d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
108e0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
108f0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10900 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10910 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10920 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10950 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10970 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10980 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10990 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
109a0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
109b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
109c0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
109d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
109e0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10a10 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10a20 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10a30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10a40 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10a50 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10a60 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10a70 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10a80 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10a90 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10aa0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
10ab0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
10ac0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
10ad0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
10ae0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
10af0 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
10b00 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
10b10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10b30 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10b40 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
10b50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10b60 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
10b70 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
10b80 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
10b90 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
10ba0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
10bb0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10bc0 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10bd0 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10be0 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10bf0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10c00 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10c10 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10c20 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10c30 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10c40 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10c50 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10c60 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10c70 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10c80 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10c90 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10ca0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10cb0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10cc0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10cd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10ce0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10cf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10d00 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10d10 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10d20 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10d30 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10d40 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10d50 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10d60 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10d70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10d80 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10d90 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10da0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10db0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10dc0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10dd0 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10de0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10df0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10e00 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10e10 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10e20 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10e30 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10e40 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10e50 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10e60 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10e70 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10e80 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10e90 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10ea0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10eb0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10ec0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10ed0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10ee0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10ef0 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10f00 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10f10 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10f20 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10f30 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10f40 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10f50 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10f60 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10f80 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10f90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10fa0 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10fb0 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10fc0 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10fd0 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10fe0 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10ff0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
11000 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11010 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
11020 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
11030 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
11040 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
11050 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
11060 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
11070 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
11080 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
11090 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
110a0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
110b0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
110c0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
110d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
110e0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
110f0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
11100 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
11110 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
11120 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
11130 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
11140 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
11150 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
11160 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
11170 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
11180 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
11190 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
111a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
111b0 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
111c0 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
111d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
111e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
111f0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11200 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11210 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11220 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11230 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
11240 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
11250 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
11260 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
11270 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
11280 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
11290 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
112a0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
112b0 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
112c0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
112d0 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
112e0 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
112f0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11300 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 30  {.  PgHdr *p = 0
11310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11320 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11330 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
11340 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
11350 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
11360 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
11370 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
11380 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
11390 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
113a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
113b0 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
113c0 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
113d0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
113e0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
113f0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
11400 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
11410 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   p;.}../*.** Dis
11420 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
11430 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11440 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
11450 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
11460 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
11470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11480 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11490 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
114a0 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
114b0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
114c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
114d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
114e0 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
114f0 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11500 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11510 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11520 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11530 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
11540 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11550 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
11560 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11570 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11580 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11590 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
115a0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
115b0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
115c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
115d0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
115e0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
115f0 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11600 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11610 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11620 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11630 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11640 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11650 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11660 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11670 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11680 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11690 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
116a0 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
116b0 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
116c0 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
116d0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
116e0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
116f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11700 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11710 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11720 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11730 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11740 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11750 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11760 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11770 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11780 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11790 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
117a0 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
117b0 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
117c0 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
117d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
117e0 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
117f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11800 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
11810 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
11820 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
11830 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
11840 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11850 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
11860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11870 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11880 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
11890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
118a0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
118b0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
118c0 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
118d0 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
118e0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
118f0 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11900 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
11910 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
11920 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
11930 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
11940 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11950 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
11960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11970 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11980 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
119a0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
119b0 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
119c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
119d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
119e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
119f0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
11a00 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
11a10 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
11a20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
11a30 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
11a40 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11a50 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
11a60 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
11a70 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11a80 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11a90 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
11aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11ab0 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11ac0 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11ad0 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11ae0 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11af0 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11b00 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11b10 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11b20 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11b30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11b40 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11b50 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
11b60 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11b70 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
11b80 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
11b90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11ba0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
11bb0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11bc0 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11bd0 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11be0 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11bf0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11c00 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11c10 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11c20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11c30 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11c40 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11c50 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11c60 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11c70 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11c80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11c90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11ca0 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11cb0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11cc0 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11cd0 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11ce0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11d00 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11d10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11d20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11d30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11d40 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11d50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11d60 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11d70 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11d80 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11d90 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11da0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11db0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11dc0 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11dd0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11de0 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11df0 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11e00 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11e10 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11e20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11e30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11e40 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11e50 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11e60 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11e70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11e80 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11e90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11ea0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11eb0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11ec0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11ee0 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11ef0 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11f00 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11f10 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11f20 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11f30 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11f40 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11f50 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11f60 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11f70 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11f80 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11f90 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11fa0 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11fb0 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11fc0 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11fd0 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11fe0 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11ff0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
12000 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
12010 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
12020 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
12030 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
12040 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
12050 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12060 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
12070 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
12080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12090 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
120a0 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
120b0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
120c0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
120d0 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
120e0 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
120f0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12100 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
12110 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
12120 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12130 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
12140 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
12150 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12160 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
12170 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
12180 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
12190 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
121a0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
121b0 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
121c0 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
121d0 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
121e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
121f0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12200 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12210 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12220 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12230 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12240 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12250 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12260 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12270 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12280 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12290 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
122a0 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
122b0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
122c0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
122d0 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
122e0 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
122f0 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12300 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12310 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12320 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12330 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12340 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12350 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12360 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12370 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12380 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12390 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
123a0 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
123b0 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
123c0 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
123d0 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
123e0 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
123f0 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12400 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12410 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12420 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12430 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12440 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12450 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12460 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12480 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12490 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
124a0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
124b0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
124c0 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
124d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
124e0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
124f0 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12500 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12510 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12520 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12530 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12540 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12550 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12560 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12570 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12580 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12590 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
125a0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
125b0 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
125c0 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
125d0 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
125e0 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
125f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12600 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12610 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
12620 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
12630 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12640 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12650 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
12660 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12670 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12680 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12690 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
126a0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
126b0 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
126c0 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
126d0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
126e0 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
126f0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
12700 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
12710 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12720 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
12730 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
12740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12750 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12760 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
12770 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
12780 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
12790 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
127a0 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
127b0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
127c0 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
127d0 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
127e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
127f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
12800 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
12810 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
12820 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
12830 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
12840 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
12850 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
12860 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
12870 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
12880 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12890 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
128a0 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
128b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
128c0 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
128d0 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
128e0 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
128f0 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
12900 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
12910 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
12920 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
12930 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
12940 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
12950 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
12960 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
12970 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
12980 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
12990 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
129a0 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
129b0 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
129c0 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
129d0 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
129e0 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
129f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12a00 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12a10 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
12a20 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
12a30 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
12a40 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
12a50 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
12a60 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12a70 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
12a80 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12a90 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
12aa0 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
12ab0 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
12ac0 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
12ad0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
12ae0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
12af0 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
12b00 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
12b10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12b20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
12b30 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
12b40 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
12b50 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
12b60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12b70 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
12b80 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
12b90 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
12ba0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
12bb0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
12bc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12bd0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
12be0 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
12bf0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
12c00 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
12c10 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
12c20 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
12c30 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
12c40 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
12c50 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
12c60 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12c70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c80 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
12c90 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12ca0 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
12cb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
12cc0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
12cd0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
12ce0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
12cf0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
12d00 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
12d10 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
12d20 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
12d30 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
12d40 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
12d50 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
12d60 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
12d70 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
12d80 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
12d90 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
12da0 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
12db0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12dc0 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
12dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12de0 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
12df0 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
12e00 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
12e10 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
12e20 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
12e30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12e40 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
12e50 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
12e60 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
12e70 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
12e80 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
12e90 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
12ea0 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
12eb0 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
12ec0 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
12ed0 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
12ee0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
12ef0 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
12f00 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
12f10 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
12f20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12f30 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
12f40 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
12f50 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
12f60 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
12f70 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
12f80 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12f90 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
12fa0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
12fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
12fc0 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
12fd0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
12fe0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
12ff0 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
13000 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
13010 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
13020 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
13030 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
13040 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
13050 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
13060 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13070 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13080 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13090 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
130a0 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
130b0 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
130c0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
130d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
130e0 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
130f0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
13100 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
13110 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
13120 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
13130 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
13140 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13150 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
13160 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13170 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13180 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13190 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
131a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
131b0 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
131c0 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
131d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
131e0 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
131f0 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
13200 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
13210 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
13220 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
13230 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
13240 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
13250 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
13260 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13270 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13280 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13290 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
132a0 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
132b0 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
132c0 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
132d0 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
132e0 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
132f0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
13300 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
13310 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
13320 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
13330 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
13340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13350 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
13360 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13370 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13380 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13390 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
133a0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
133b0 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
133c0 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
133d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
133e0 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
133f0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
13400 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
13410 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
13420 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
13430 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
13440 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
13450 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
13460 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
13470 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
13480 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
13490 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
134a0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
134b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
134c0 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
134d0 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
134e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
134f0 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
13500 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
13510 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
13520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
13530 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
13540 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
13550 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
13560 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
13570 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
13580 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
13590 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
135a0 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
135b0 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
135c0 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
135d0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
135e0 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
135f0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13600 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
13610 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
13620 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
13630 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
13640 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
13650 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
13660 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
13670 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
13680 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
13690 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
136a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
136b0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
136c0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
136d0 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
136e0 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
136f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13700 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
13710 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
13720 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
13730 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
13740 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13750 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
13760 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
13770 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
13780 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
13790 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
137a0 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
137b0 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
137c0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
137d0 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
137e0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
137f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
13800 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
13810 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
13820 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
13830 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
13840 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
13850 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
13860 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
13870 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
13880 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
13890 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
138a0 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
138b0 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
138c0 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
138d0 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
138e0 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
138f0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
13900 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
13910 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
13920 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
13930 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
13940 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
13950 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
13960 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
13970 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
13980 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
13990 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
139a0 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
139b0 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
139c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
139d0 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
139e0 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
139f0 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
13a00 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
13a10 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
13a20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
13a30 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
13a40 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
13a50 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
13a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13a70 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
13a80 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
13a90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
13aa0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
13ab0 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
13ac0 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
13ad0 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
13ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13af0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
13b00 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
13b10 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13b20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
13b30 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
13b40 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
13b50 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13b60 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
13b70 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
13b80 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
13b90 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
13ba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
13bb0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13bc0 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
13bd0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13be0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13bf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13c00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13c10 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
13c20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13c30 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13c40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13c50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13c60 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13c70 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
13c80 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
13c90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
13ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
13ce0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13cf0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  jfd, 0);.      }
13d00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13d10 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13d20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13d30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13d40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13d50 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
13d60 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
13d70 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
13d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13d90 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
13da0 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29  LMODE_WAL).    )
13db0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
13dc0 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
13dd0 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
13de0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13df0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13e10 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
13e20 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69  y be executed wi
13e30 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  th Pager.journal
13e40 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a  Mode==MEMORY if.
13e50 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a        ** a hot-j
13e60 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20  ournal was just 
13e70 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20  rolled back. In 
13e80 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
13e90 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66  urnal.      ** f
13ea0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ile should be cl
13eb0 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
13ec0 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  . If this connec
13ed0 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20  tion writes to. 
13ee0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
13ef0 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69  base file, it wi
13f00 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61  ll do so using a
13f10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
13f20 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  nal. .      */. 
13f30 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
13f40 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d   = (!pPager->tem
13f50 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  pFile && sqlite3
13f60 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50  JournalExists(pP
13f70 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20  ager->jfd));.   
13f80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13f90 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13fa0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13fb0 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
13fc0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
13fd0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13fe0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
13ff0 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
14000 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14010 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14020 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
14030 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14040 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
14050 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
14060 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29     if( bDelete )
14070 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14080 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
14090 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
140a0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
140b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
140c0 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
140d0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
140e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
140f0 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
14100 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
14110 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
14120 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14130 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
14140 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
14150 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
14160 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
14170 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f  dr *p = pager_lo
14180 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b  okup(pPager, 1);
14190 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
141a0 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20      p->pageHash 
141b0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
141c0 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
141d0 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ull(p);.    }.  
141e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
141f0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
14200 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
14210 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
14220 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
14230 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
14240 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   0;.  sqlite3Pca
14250 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
14260 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
14270 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
14280 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
14290 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
142a0 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70  bSize);..  if( p
142b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
142c0 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f  r) ){.    /* Dro
142d0 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d  p the WAL write-
142e0 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c  lock, if any. Al
142f0 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65  so, if the conne
14300 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20  ction was in .  
14310 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64    ** locking_mod
14320 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
14330 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   but is no longe
14340 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c  r, drop the EXCL
14350 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f  USIVE .    ** lo
14360 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  ck held on the d
14370 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
14380 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73    */.    rc2 = s
14390 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74  qlite3WalEndWrit
143a0 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
143b0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
143c0 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c  assert( rc2==SQL
143d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73  ITE_OK );.  }els
143e0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
143f0 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14400 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  & pPager->dbFile
14410 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53  Size>pPager->dbS
14420 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ize ){.    /* Th
14430 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
14440 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  en when committi
14450 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
14460 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75   in rollback-jou
14470 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  rnal.    ** mode
14480 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
14490 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
144a0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
144b0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
144c0 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20  .    ** At this 
144d0 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  point the journa
144e0 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  l has been final
144f0 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61  ized and the tra
14500 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  nsaction .    **
14510 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
14520 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65  mmitted, but the
14530 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
14540 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
14550 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65   the.    ** file
14560 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20  . So it is safe 
14570 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
14580 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
14590 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   its minimum.   
145a0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a   ** required siz
145b0 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
145c0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
145d0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
145e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
145f0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14600 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
14610 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ze);.  }..  if( 
14620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14630 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70   bCommit && isOp
14640 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
14650 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14660 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
14670 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
14680 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f  TE_FCNTL_COMMIT_
14690 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20  PHASETWO, 0);.  
146a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
146b0 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
146c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
146d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
146e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
146f0 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57    && (!pagerUseW
14700 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71  al(pPager) || sq
14710 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
14720 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
14730 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20  al, 0)).  ){.   
14740 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f   rc2 = pagerUnlo
14750 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
14760 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
14770 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
14780 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
14790 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
147a0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
147b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
147c0 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74  ster = 0;..  ret
147d0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
147e0 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
147f0 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
14800 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
14810 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
14820 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
14830 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
14840 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
14850 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
14860 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
14870 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f   ERROR state, do
14880 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
14890 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
148a0 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
148b0 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
148c0 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
148d0 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
148e0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
148f0 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
14900 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
14910 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
14920 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
14930 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61  ove the pager ba
14940 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
14950 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65  . If this .** me
14960 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ans that there i
14970 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
14980 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
14990 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78  -system, the nex
149a0 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  t .** connection
149b0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
149c0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
149d0 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
149e0 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a   be this one) .*
149f0 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62  * will roll it b
14a00 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
14a10 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
14a20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
14a30 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
14a40 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
14a50 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
14a60 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
14a70 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
14a80 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
14a90 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
14aa0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
14ab0 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63  RROR state. Whic
14ac0 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
14ad0 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
14ae0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14af0 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
14b00 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
14b10 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
14b20 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
14b30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14b40 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14b50 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
14b60 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
14b70 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e!=PAGER_OPEN ){
14b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
14b90 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
14ba0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69  pPager) );.    i
14bb0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
14bc0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
14bd0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
14be0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
14bf0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
14c00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
14c10 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
14c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
14c30 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14c40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
14c50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14c60 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Mode ){.      as
14c70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
14c80 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
14c90 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ER );.      page
14ca0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
14cb0 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  n(pPager, 0, 0);
14cc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
14cd0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
14ce0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
14cf0 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
14d00 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14d10 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
14d20 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
14d30 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
14d40 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
14d50 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
14d60 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
14d70 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
14d80 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
14d90 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
14da0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14db0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
14dc0 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
14dd0 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
14de0 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
14df0 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
14e00 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
14e10 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14e20 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
14e30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
14e40 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
14e50 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
14e60 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
14e70 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
14e80 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
14e90 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
14ea0 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
14eb0 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
14ec0 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
14ed0 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
14ee0 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
14ef0 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
14f00 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
14f10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
14f20 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
14f30 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
14f40 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
14f50 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
14f60 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
14f70 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
14f80 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
14f90 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
14fa0 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
14fb0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
14fc0 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
14fd0 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
14fe0 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
14ff0 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
15000 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
15010 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
15020 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
15030 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
15040 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
15050 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
15060 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
15070 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
15080 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
15090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
150a0 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
150b0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
150c0 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
150d0 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
150e0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
150f0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
15100 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
15110 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
15120 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
15130 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
15140 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15150 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
15160 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
15170 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
15180 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
15190 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
151a0 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
151b0 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
151c0 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
151d0 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
151e0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
151f0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
15200 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
15210 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
15220 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
15230 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
15240 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
15250 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
15260 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
15270 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
15280 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
15290 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
152c0 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
152d0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
152e0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
152f0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
15300 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
15310 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
15320 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
15330 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
15340 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
15350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
15360 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
15370 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
15380 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
15390 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
153a0 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
153b0 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
153c0 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
153d0 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
153e0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
153f0 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
15400 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
15410 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
15420 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
15430 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
15440 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
15450 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
15460 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
15470 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
15480 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
15490 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
154a0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
154b0 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
154c0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
154d0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
154e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
154f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15500 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
15510 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
15520 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
15530 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
15540 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
15550 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
15560 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
15570 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
15580 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
15590 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
155a0 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
155b0 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
155c0 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
155d0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
155e0 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
155f0 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
15600 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
15610 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
15620 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
15630 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
15640 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
15650 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
15660 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
15670 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
15680 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
15690 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
156a0 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
156b0 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
156c0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
156d0 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
156e0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
156f0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
15700 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
15710 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
15720 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
15730 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15740 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
15750 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
15760 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15770 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
15780 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
15790 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
157a0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
157b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
157c0 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
157d0 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
157e0 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
157f0 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
15800 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
15810 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
15820 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
15830 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
15840 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
15850 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
15860 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
15870 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
15880 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
15890 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
158a0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
158b0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
158c0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
158d0 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
158e0 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
158f0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
15900 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
15910 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
15920 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
15930 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
15940 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
15950 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
15960 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
15970 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15980 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
15990 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
159a0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
159b0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
159c0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
159d0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
159e0 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
159f0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
15a00 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
15a10 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
15a20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
15a30 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
15a40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a60 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
15a70 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15a80 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15aa0 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
15ab0 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
15ac0 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
15ad0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15ae0 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
15af0 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
15b00 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
15b10 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
15b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
15b30 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
15b40 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
15b50 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
15b60 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
15b70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
15b80 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
15b90 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
15ba0 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
15bb0 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
15bc0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
15bd0 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
15be0 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
15bf0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
15c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15c10 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15c20 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
15c30 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
15c40 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
15c50 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15c60 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
15c70 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
15c80 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ca0 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
15cb0 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
15cc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
15cd0 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
15ce0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
15cf0 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
15d00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
15d10 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
15d20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
15d30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
15d40 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
15d50 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
15d60 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
15d70 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
15d80 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
15d90 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15da0 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
15db0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
15dc0 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
15dd0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
15de0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
15df0 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
15e00 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
15e10 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
15e20 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
15e30 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
15e40 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
15e50 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
15e60 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
15e70 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
15e80 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15e90 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
15ea0 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
15eb0 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
15ec0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
15ed0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
15ee0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
15ef0 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
15f00 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
15f10 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
15f20 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
15f30 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
15f40 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
15f50 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
15f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
15f70 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
15f80 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
15f90 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
15fa0 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
15fb0 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
15fc0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
15fd0 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
15fe0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15ff0 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
16000 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
16010 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
16020 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16030 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
16040 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
16050 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
16060 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
16070 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
16080 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
16090 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
160a0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
160b0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
160c0 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
160d0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
160e0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
160f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
16100 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
16110 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16120 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16130 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
16140 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
16150 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16160 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
16170 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
16180 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
16190 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
161a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
161b0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
161c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
161d0 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
161e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
161f0 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
16200 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
16210 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
16220 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
16230 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16240 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16250 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
16260 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
16270 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
16280 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
16290 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
162a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
162b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
162c0 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
162d0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
162e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
162f0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
16300 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
16310 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
16320 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
16330 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
16340 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
16350 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
16360 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
16370 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
16380 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
16390 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
163a0 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
163b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
163c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
163d0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
163e0 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
163f0 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
16400 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
16410 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
16420 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
16430 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
16440 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
16450 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
16460 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
16470 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
16490 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
164a0 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
164b0 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
164c0 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
164d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
164e0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
164f0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
16500 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16510 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
16520 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
16530 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16540 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
16550 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
16560 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
16570 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
16580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16590 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
165a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
165b0 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
165c0 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
165d0 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  by before during
165e0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
165f0 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
16600 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
16610 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
16620 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
16630 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
16640 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
16650 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
16660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16670 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
16680 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
16690 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
166a0 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
166b0 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
166c0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
166d0 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
166e0 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
166f0 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
16700 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
16710 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
16720 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
16730 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
16740 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
16750 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
16760 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
16770 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
16780 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
16790 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
167a0 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
167b0 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
167c0 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
167d0 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
167e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
167f0 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
16800 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
16810 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
16820 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
16830 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
16840 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
16850 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
16860 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
16870 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
16880 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
16890 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
168a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
168b0 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
168c0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
168d0 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
168e0 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
168f0 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
16900 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
16910 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
16920 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
16930 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
16940 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
16950 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
16960 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
16970 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
16980 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
16990 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
169a0 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
169b0 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
169c0 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
169d0 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
169e0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
169f0 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
16a00 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
16a10 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
16a20 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
16a30 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
16a40 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
16a50 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
16a60 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
16a70 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
16a80 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16a90 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
16aa0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
16ab0 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
16ac0 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
16ad0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
16ae0 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
16af0 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
16b00 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
16b10 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
16b20 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
16b30 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
16b40 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
16b50 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
16b60 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
16b70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16b80 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
16b90 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
16ba0 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
16bb0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
16bc0 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
16bd0 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
16be0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
16bf0 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
16c00 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
16c10 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
16c20 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
16c30 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
16c40 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
16c50 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
16c60 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
16c70 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
16c80 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
16c90 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
16ca0 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
16cb0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
16cc0 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
16cd0 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
16ce0 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
16cf0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
16d00 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
16d10 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
16d20 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16d30 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
16d40 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
16d50 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
16d60 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
16d70 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
16d80 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
16d90 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
16da0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
16db0 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
16dc0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
16dd0 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
16de0 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
16df0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
16e00 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
16e10 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
16e20 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
16e30 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
16e40 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
16e50 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
16e60 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
16e70 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
16e80 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
16e90 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
16ea0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
16eb0 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
16ec0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
16ed0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
16ee0 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
16ef0 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
16f00 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
16f10 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
16f20 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
16f30 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
16f40 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
16f50 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
16f60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
16f70 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
16f80 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
16f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
16fa0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
16fb0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
16fc0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
16fd0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
16fe0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16ff0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
17000 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a  EN || pPg==0 );.
17010 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
17020 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
17030 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
17040 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17050 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
17060 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
17070 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
17080 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
17090 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
170a0 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
170b0 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
170c0 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
170d0 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
170e0 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
170f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
17100 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
17110 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
17120 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
17130 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
17140 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
17150 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
17160 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
17170 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  }.  if( isOpen(p
17180 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
17190 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
171a0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
171b0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
171c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
171d0 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  EN).   && isSync
171e0 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
171f0 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
17200 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
17210 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
17220 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
17230 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
17240 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
17250 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
17260 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
17270 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
17280 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
17290 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
172a0 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44  er->fd, (u8 *)aD
172b0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
172c0 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
172d0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
172e0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
172f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
17300 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
17310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17320 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
17330 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
17340 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
17350 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17360 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
17370 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
17380 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
17390 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
173a0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
173b0 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
173c0 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
173d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
173e0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
173f0 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
17400 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
17410 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
17420 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
17430 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
17440 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
17450 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
17460 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
17470 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
17480 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
17490 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
174a0 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
174b0 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
174c0 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
174d0 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
174e0 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
174f0 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
17500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17510 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
17520 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
17530 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
17540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
17550 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
17560 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
17570 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
17580 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
17590 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
175a0 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
175b0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
175c0 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
175d0 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
175e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
175f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
17600 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17610 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
17620 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
17630 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
17640 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
17650 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
17660 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
17670 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
17680 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
17690 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
176a0 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
176b0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
176c0 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
176d0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
176e0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
176f0 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
17700 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
17710 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
17720 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
17730 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
17740 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
17750 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
17760 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
17770 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
17780 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
17790 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
177a0 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
177b0 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
177c0 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b  _ROLLBACK)==0 );
177d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
177e0 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
177f0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
17800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17810 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
17820 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
17830 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
17840 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
17850 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
17860 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
17870 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
17880 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
17890 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
178a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
178b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
178c0 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
178d0 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
178e0 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
178f0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
17900 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
17910 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
17920 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
17930 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
17940 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
17950 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
17960 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
17970 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
17980 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
17990 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
179a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
179b0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
179c0 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
179d0 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
179e0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
179f0 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
17a00 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
17a10 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
17a20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
17a30 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
17a40 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
17a50 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
17a60 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
17a70 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
17a80 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
17a90 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
17aa0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17ab0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
17ac0 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
17ad0 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
17ae0 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
17af0 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
17b00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17b10 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
17b20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
17b30 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
17b40 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
17b50 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
17b60 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
17b70 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
17b80 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
17b90 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
17ba0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
17bb0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
17bc0 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
17bd0 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
17be0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
17bf0 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
17c00 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
17c10 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
17c20 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
17c30 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
17c40 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
17c50 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
17c60 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
17c70 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
17c80 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
17c90 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
17ca0 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
17cb0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17cc0 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
17cd0 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
17ce0 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
17cf0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
17d00 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
17d10 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
17d20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
17d30 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
17d40 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
17d50 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
17d60 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
17d70 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
17d80 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
17d90 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17da0 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
17db0 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
17dc0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
17dd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
17de0 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
17df0 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
17e00 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17e10 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17e20 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
17e30 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
17e40 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
17e50 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
17e60 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
17e70 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
17e80 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
17e90 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17ea0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17eb0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
17ec0 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
17ed0 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
17ee0 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
17ef0 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
17f00 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
17f10 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
17f20 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
17f30 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
17f40 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
17f50 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
17f60 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
17f70 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
17f80 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
17f90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17fa0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17fb0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
17fd0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
17fe0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  g);.    }.    pa
17ff0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
18000 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  (pPg);..    /* I
18010 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
18020 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
18030 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
18040 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
18050 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
18060 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
18070 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
18080 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
18090 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
180a0 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
180b0 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
180c0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
180d0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
180e0 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
180f0 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
18100 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
18110 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
18120 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
18130 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
18140 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c  _NOMEM);.    sql
18150 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
18160 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
18170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18180 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
18190 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
181a0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
181b0 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
181c0 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
181d0 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
181e0 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
181f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
18200 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
18210 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
18220 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
18230 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
18240 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
18250 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18260 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
18270 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
18280 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
18290 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
182a0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
182b0 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
182c0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
182d0 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
182e0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
182f0 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
18300 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18310 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
18320 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
18330 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
18340 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
18350 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
18360 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
18370 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
18380 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
18390 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
183a0 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
183b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
183c0 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
183d0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
183e0 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
183f0 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
18400 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
18410 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
18420 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
18430 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
18440 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
18450 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
18460 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
18470 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
18480 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
18490 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
184a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
184b0 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
184c0 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
184d0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
184e0 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
184f0 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
18500 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
18510 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
18520 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
18530 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
18540 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
18550 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
18560 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
18570 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
18580 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
18590 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
185a0 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
185b0 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
185c0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
185d0 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
185e0 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
185f0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
18600 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
18610 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
18620 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
18630 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
18640 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
18650 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
18660 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
18670 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
18680 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
18690 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
186a0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
186b0 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
186c0 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
186d0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
186e0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
186f0 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
18700 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
18710 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
18720 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
18730 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
18740 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
18750 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
18760 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
18770 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
18780 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
18790 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
187a0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
187b0 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
187c0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
187d0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
187e0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
187f0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
18800 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
18810 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
18820 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18830 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
18840 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
18850 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
18860 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
18870 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
18880 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
18890 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
188a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
188b0 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
188c0 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
188d0 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
188e0 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
188f0 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
18900 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
18910 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
18920 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
18930 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
18940 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
18950 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
18960 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
18970 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18990 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
189a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
189b0 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
189c0 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
189d0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
189e0 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
189f0 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
18a00 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
18a10 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
18a20 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18a30 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
18a40 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
18a50 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
18a60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
18a70 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
18a80 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
18a90 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
18aa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18ab0 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
18ac0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
18ad0 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
18ae0 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
18af0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18b00 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
18b10 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
18b20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
18b30 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
18b40 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
18b50 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
18b60 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
18b70 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
18b80 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
18b90 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18ba0 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
18bb0 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
18bc0 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
18bd0 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
18be0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
18bf0 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
18c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
18c10 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
18c20 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
18c30 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
18c40 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
18c50 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
18c60 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
18c70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
18c80 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
18c90 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
18ca0 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
18cb0 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
18cc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
18cd0 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
18ce0 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
18cf0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18d00 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
18d10 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
18d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18d30 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
18d40 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
18d50 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
18d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18d70 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
18d80 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  r_out;..  /* Loa
18d90 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
18da0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18db0 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
18dc0 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73  ined from.  ** s
18dd0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
18de0 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
18df0 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
18e00 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a  .   Also obtain.
18e10 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20    ** sufficient 
18e20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65  space (in zMaste
18e30 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68  rPtr) to hold th
18e40 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65  e names of maste
18e50 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  r.  ** journal f
18e60 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66  iles extracted f
18e70 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c  rom regular roll
18e80 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20  back-journals.. 
18e90 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18ea0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
18eb0 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
18ec0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
18ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18ee0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18ef0 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  ;.  nMasterPtr =
18f00 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
18f10 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  e+1;.  zMasterJo
18f20 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
18f30 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
18f40 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
18f50 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
18f60 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
18f70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18f80 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
18f90 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18fa0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
18fb0 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
18fc0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
18fd0 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
18fe0 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
18ff0 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
19000 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
19010 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
19020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19030 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
19040 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
19050 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
19060 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
19070 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
19080 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
19090 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
190a0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
190b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
190c0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
190d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
190e0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
190f0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
19100 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
19110 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
19120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19130 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
19140 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19150 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
19160 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
19170 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
19180 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
19190 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
191a0 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
191b0 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
191c0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
191d0 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
191e0 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
191f0 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
19200 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
19210 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19220 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
19230 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
19240 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
19250 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
19260 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
19270 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
19280 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
19290 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
192a0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
192b0 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
192c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
192d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
192e0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
192f0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
19300 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
19310 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
19320 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
19330 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
19340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
19350 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
19360 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19380 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19390 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
193a0 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
193b0 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
193c0 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
193d0 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
193e0 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
193f0 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
19400 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
19410 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
19420 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
19430 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
19440 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19460 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
19470 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
19480 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
19490 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
194a0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
194b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
194c0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
194d0 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
194e0 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
194f0 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
19500 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
19510 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
19520 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
19530 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
19540 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
19550 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
19560 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
19570 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19580 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
19590 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
195a0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
195b0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
195c0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
195d0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
195e0 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
195f0 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
19600 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
19610 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
19620 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
19630 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
19640 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
19650 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
19660 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
19670 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
19680 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
19690 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
196a0 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
196b0 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
196c0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
196d0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
196e0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
196f0 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
19700 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
19710 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
19720 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
19730 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
19740 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
19750 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
19760 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
19770 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
19780 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
19790 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
197a0 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
197b0 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
197c0 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
197d0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
197e0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
197f0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
19800 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
19810 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
19820 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
19830 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
19840 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
19850 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
19860 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
19870 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
19880 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
19890 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
198a0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
198b0 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
198c0 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
198d0 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
198e0 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
198f0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
19900 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
19910 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
19920 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
19930 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
19940 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
19950 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
19960 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
19970 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
19980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19990 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
199a0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
199b0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
199c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
199d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
199e0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
199f0 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
19a00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
19a10 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
19a20 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
19a30 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
19a40 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
19a50 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
19a60 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
19a70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
19a80 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
19a90 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
19aa0 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
19ab0 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
19ac0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
19ad0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19ae0 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
19af0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
19b00 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
19b10 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
19b20 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
19b30 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
19b40 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
19b50 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
19b60 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
19b70 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a  ewSize = szPage*
19b80 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
19b90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19ba0 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
19bb0 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
19bc0 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
19bd0 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
19be0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19bf0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
19c00 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
19c10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
19c20 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b  f( (currentSize+
19c30 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65  szPage)<=newSize
19c40 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
19c50 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d   *pTmp = pPager-
19c60 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
19c70 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c      memset(pTmp,
19c80 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20   0, szPage);.   
19c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
19ca0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
19cb0 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  == currentSize )
19cc0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19cd0 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
19ce0 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53  age) >  currentS
19cf0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ize );.        r
19d00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
19d10 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
19d20 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77  Tmp, szPage, new
19d30 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20  Size-szPage);.  
19d40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19d50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19d60 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
19d70 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
19d80 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
19d90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19da0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
19db0 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20  urn a sanitized 
19dc0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
19dd0 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53  ector-size of OS
19de0 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65   file pFile. The
19df0 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
19e00 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
19e10 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32  o lie between 32
19e20 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f   and MAX_SECTOR_
19e30 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  SIZE..*/.int sql
19e40 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73  ite3SectorSize(s
19e50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
19e60 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20  le){.  int iRet 
19e70 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
19e80 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20  rSize(pFile);.  
19e90 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20  if( iRet<32 ){. 
19ea0 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20     iRet = 512;. 
19eb0 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e   }else if( iRet>
19ec0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
19ed0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
19ee0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
19ef0 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20  512 );.    iRet 
19f00 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
19f10 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
19f20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  iRet;.}../*.** S
19f30 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
19f40 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
19f50 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
19f60 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
19f70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
19f80 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
19f90 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
19fa0 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
19fb0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
19fc0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
19fd0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
19fe0 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74   used used .** t
19ff0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1a000 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65  size and alignme
1a010 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  nt of journal he
1a020 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73  ader and .** mas
1a030 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
1a040 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61  ters within crea
1a050 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
1a060 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
1a070 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65  porary files the
1a080 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a090 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73  r size is always
1a0a0 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a   512 bytes..**.*
1a0b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  * Otherwise, for
1a0c0 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66   non-temporary f
1a0d0 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74  iles, the effect
1a0e0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a0f0 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  is.** the value 
1a100 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1a110 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65  xSectorSize() me
1a120 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20  thod rounded up 
1a130 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69  to 32 if.** it i
1a140 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20  s less than 32, 
1a150 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20  or rounded down 
1a160 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  to MAX_SECTOR_SI
1a170 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67  ZE if it.** is g
1a180 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f  reater than MAX_
1a190 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a  SECTOR_SIZE..**.
1a1a0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68  ** If the file h
1a1b0 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  as the SQLITE_IO
1a1c0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1a1d0 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79  ERWRITE property
1a1e0 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68  , then set.** th
1a1f0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a200 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d  or size to its m
1a210 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31  inimum value (51
1a220 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  2).  The purpose
1a230 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73   of.** pPager->s
1a240 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20  ectorSize is to 
1a250 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73  define the "blas
1a260 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74  t radius" of byt
1a270 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  es that.** might
1a280 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61   change if a cra
1a290 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  sh occurs while 
1a2a0 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e  writing to a sin
1a2b0 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74  gle byte in.** t
1a2c0 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20  hat range.  But 
1a2d0 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f  with POWERSAFE_O
1a2e0 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c  VERWRITE, the bl
1a2f0 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65  ast radius is ze
1a300 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77  ro.** (that is w
1a310 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  hat POWERSAFE_OV
1a320 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20  ERWRITE means), 
1a330 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  so we minimize t
1a340 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a  he sector.** siz
1a350 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64  e.  For backward
1a360 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
1a370 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1a380 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a390 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f  mat,.** we canno
1a3a0 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  t reduce the eff
1a3b0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1a3c0 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f  ze below 512..*/
1a3d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1a3e0 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
1a3f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
1a400 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1a410 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1a420 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
1a430 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
1a440 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71  mpFile.   || (sq
1a450 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1a460 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1a470 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20  ger->fd) & .    
1a480 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1a490 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1a4a0 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20  _OVERWRITE)!=0. 
1a4b0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
1a4c0 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
1a4d0 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
1a4e0 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
1a4f0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
1a500 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
1a510 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
1a520 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
1a530 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
1a540 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
1a550 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20   segfault. */.  
1a560 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
1a570 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65  Size = 512;.  }e
1a580 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
1a590 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
1a5a0 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
1a5b0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
1a5c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
1a5d0 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
1a5e0 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
1a5f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a600 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
1a610 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
1a620 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
1a630 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
1a640 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
1a650 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
1a660 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
1a670 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
1a680 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
1a690 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
1a6a0 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
1a6b0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1a6c0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a6d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
1a6e0 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
1a6f0 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
1a700 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
1a710 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
1a720 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
1a730 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
1a740 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
1a750 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
1a760 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
1a770 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
1a780 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1a790 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a7a0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
1a7b0 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
1a7c0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
1a7d0 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
1a7e0 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
1a7f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1a800 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
1a810 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1a820 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
1a830 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
1a840 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
1a850 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a860 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
1a870 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
1a880 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
1a890 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
1a8a0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
1a8b0 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
1a8c0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1a8d0 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
1a8e0 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20  e size..**  (7) 
1a8f0 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75   zero padding ou
1a900 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  t to the next se
1a910 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  ctor size..**  (
1a920 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  8)  Zero or more
1a930 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
1a940 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
1a950 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
1a960 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
1a970 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
1a980 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a990 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
1a9a0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1a9b0 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
1a9c0 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
1a9d0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1a9e0 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
1a9f0 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65   the first 7 ite
1aa00 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
1aa10 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
1aa20 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
1aa30 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68  tance of the 8th
1aa40 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
1aa50 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
1aa60 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
1aa70 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
1aa80 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1aa90 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
1aaa0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
1aab0 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
1aac0 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
1aad0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
1aae0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
1aaf0 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
1ab00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1ab10 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
1ab20 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
1ab30 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
1ab40 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1ab50 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
1ab60 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
1ab70 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
1ab80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1ab90 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
1aba0 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
1abb0 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
1abc0 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
1abd0 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
1abe0 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
1abf0 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
1ac00 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1ac10 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
1ac20 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
1ac30 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
1ac40 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
1ac50 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
1ac60 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
1ac70 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
1ac80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
1ac90 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
1aca0 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
1acb0 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
1acc0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
1acd0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1ace0 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
1acf0 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
1ad00 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
1ad10 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
1ad20 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
1ad30 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
1ad40 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
1ad50 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
1ad60 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
1ad70 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
1ad80 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
1ad90 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
1ada0 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
1adb0 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
1adc0 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
1add0 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
1ade0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1adf0 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
1ae00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
1ae10 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
1ae20 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
1ae30 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
1ae40 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
1ae50 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
1ae60 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1ae70 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
1ae80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1ae90 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
1aea0 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
1aeb0 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
1aec0 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
1aed0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
1aee0 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
1aef0 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
1af00 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
1af10 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
1af20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
1af30 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
1af40 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
1af50 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
1af60 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1af70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1af80 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61  * The isHot para
1af90 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
1afa0 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69  that we are tryi
1afb0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ng to rollback a
1afc0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74   journal.** that
1afd0 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20   might be a hot 
1afe0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74  journal.  Or, it
1aff0 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74   could be that t
1b000 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a  he journal is .*
1b010 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61  * preserved beca
1b020 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f  use of JOURNALMO
1b030 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f  DE_PERSIST or JO
1b040 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
1b050 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  TE..** If the jo
1b060 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20  urnal really is 
1b070 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70  hot, reset the p
1b080 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72  ager cache prior
1b090 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b   rolling.** back
1b0a0 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49   any content.  I
1b0b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
1b0c0 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65   merely persiste
1b0d0 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a  nt, no reset is.
1b0e0 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
1b0f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
1b100 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
1b110 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
1b120 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1b130 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1b140 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
1b150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b160 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1b170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
1b180 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1b190 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
1b1a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b1b0 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
1b1c0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
1b1d0 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
1b1e0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1b1f0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1b200 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
1b210 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1b220 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
1b230 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
1b240 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
1b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b260 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1b270 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
1b280 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
1b290 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
1b2a0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1b2b0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
1b2c0 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
1b2d0 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
1b2e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
1b2f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1b300 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  le if any */.  i
1b310 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  nt needPagerRese
1b320 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
1b330 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72  to reset page pr
1b340 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67  ior to first pag
1b350 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  e rollback */.  
1b360 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20  int nPlayback = 
1b370 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  0;       /* Tota
1b380 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1b390 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20  s restored from 
1b3a0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a  journal */..  /*
1b3b0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1b3c0 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
1b3d0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1b3e0 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
1b3f0 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
1b400 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
1b410 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1b420 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1b430 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1b440 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1b450 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
1b460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b470 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
1b480 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
1b490 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1b4a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
1b4b0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
1b4c0 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
1b4d0 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
1b4e0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1b4f0 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
1b500 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
1b510 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
1b520 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
1b530 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
1b540 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
1b550 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
1b560 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
1b570 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
1b580 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
1b590 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
1b5a0 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
1b5b0 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
1b5c0 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
1b5d0 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
1b5e0 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
1b5f0 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
1b600 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
1b610 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
1b620 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
1b630 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1b640 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
1b650 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78  unix.c,.  **  mx
1b660 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c  Pathname is 512,
1b670 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
1b680 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75  me as the minimu
1b690 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75  m allowable valu
1b6a0 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53  e.  ** for pageS
1b6b0 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ize..  */.  zMas
1b6c0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1b6d0 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
1b6e0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1b6f0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1b700 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1b710 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1b720 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
1b730 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1b740 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
1b750 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1b760 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
1b770 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1b780 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
1b790 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
1b7a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1b7b0 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
1b7c0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1b7d0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
1b7e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b7f0 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65   = 0;.  needPage
1b800 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a  rReset = isHot;.
1b810 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
1b820 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
1b830 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75  r when a readJou
1b840 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20  rnalHdr() or .  
1b850 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
1b860 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c  k_one_page() cal
1b870 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
1b880 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
1b890 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72  rror .  ** occur
1b8a0 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  s. .  */.  while
1b8b0 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  ( 1 ){.    /* Re
1b8c0 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
1b8d0 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
1b8e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b8f0 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
1b900 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
1b910 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
1b920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b930 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
1b940 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
1b950 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
1b960 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
1b970 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  s must have fail
1b980 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
1b990 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
1b9a0 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
1b9b0 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
1b9c0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1b9d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1b9e0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
1b9f0 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
1ba00 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
1ba10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ba20 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
1ba30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ba40 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1ba50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ba60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ba70 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ba80 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1ba90 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
1baa0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
1bab0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
1bac0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1bad0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
1bae0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
1baf0 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
1bb00 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
1bb10 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
1bb20 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
1bb30 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
1bb40 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
1bb50 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
1bb60 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
1bb70 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
1bb80 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
1bb90 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
1bba0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
1bbb0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
1bbc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1bbd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1bbe0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1bbf0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
1bc00 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1bc10 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
1bc20 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
1bc30 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1bc40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1bc50 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
1bc60 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
1bc70 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1bc80 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
1bc90 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
1bca0 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
1bcb0 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
1bcc0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
1bcd0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
1bce0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
1bcf0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
1bd00 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
1bd10 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
1bd20 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
1bd30 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1bd40 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
1bd50 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
1bd60 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
1bd70 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
1bd80 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
1bd90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1bda0 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
1bdb0 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
1bdc0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
1bdd0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
1bde0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
1bdf0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
1be00 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
1be10 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
1be20 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
1be30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
1be40 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
1be50 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1be60 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
1be70 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
1be80 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
1be90 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
1bea0 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
1beb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
1bec0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
1bed0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
1bee0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
1bef0 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
1bf00 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
1bf10 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1bf20 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
1bf30 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
1bf40 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1bf50 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
1bf60 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1bf70 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
1bf80 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
1bf90 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
1bfa0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1bfb0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
1bfc0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
1bfd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1bfe0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
1bff0 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
1c000 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c010 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
1c020 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1c030 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1c040 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1c050 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
1c060 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
1c070 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
1c080 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1c090 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
1c0a0 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
1c0b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
1c0c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1c0d0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c0e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
1c0f0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
1c100 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
1c110 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1c120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c130 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1c140 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
1c150 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c160 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
1c170 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
1c180 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
1c190 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
1c1a0 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
1c1b0 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
1c1c0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
1c1d0 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
1c1e0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
1c1f0 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
1c200 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
1c210 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
1c220 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1c230 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1c240 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
1c250 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1c260 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1c270 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
1c280 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a  Pager,&pPager->j
1c290 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29  ournalOff,0,1,0)
1c2a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1c2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c2c0 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b       nPlayback++
1c2d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c2e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c2f0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1c300 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c310 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
1c320 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c330 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1c340 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c350 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1c360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1c370 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1c380 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74  has been truncat
1c390 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20  ed, simply stop 
1c3a0 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20  reading and.    
1c3b0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1c3c0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ing the journal.
1c3d0 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70   This might happ
1c3e0 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  en if the journa
1c3f0 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20  l was.          
1c400 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ** not completel
1c410 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79  y written and sy
1c420 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20  nced prior to a 
1c430 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a  crash.  In that.
1c440 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
1c450 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
1c460 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65  should have neve
1c470 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  r been written i
1c480 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
1c490 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73  ** first place s
1c4a0 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69  o it is OK to si
1c4b0 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65  mply abandon the
1c4c0 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20   rollback. */.  
1c4d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c4e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1c4f0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c500 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ack;.        }el
1c510 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1c520 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
1c530 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71  e to rollback, q
1c540 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  uit and return t
1c550 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
1c560 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69     ** code.  Thi
1c570 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
1c580 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
1c590 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a  the error state.
1c5a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1c5b0 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20  that no further 
1c5c0 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e  harm will be don
1c5d0 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20  e.  Perhaps the 
1c5e0 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a  next.          *
1c5f0 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d  * process to com
1c600 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20  e along will be 
1c610 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
1c620 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
1c630 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1c640 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c650 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1c660 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c670 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
1c680 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
1c690 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
1c6a0 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69  ck:.  /* Followi
1c6b0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
1c6c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c6d0 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20   should be back 
1c6e0 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  in its original.
1c6f0 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72    ** state prior
1c700 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
1c710 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c720 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a  , so invoke the.
1c730 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54    ** SQLITE_FCNT
1c740 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66  L_DB_UNCHANGED f
1c750 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile-control meth
1c760 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  od to disable th
1c770 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e  e.  ** assertion
1c780 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
1c790 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
1c7a0 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f  s modified..  */
1c7b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c7c0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67 65  EBUG.  if( pPage
1c7d0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
1c7e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
1c7f0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
1c800 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54  pPager->fd,SQLIT
1c810 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1c820 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e  NGED,0);.  }.#en
1c830 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  dif..  /* If thi
1c840 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
1c850 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
1c860 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
1c870 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
1c880 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
1c890 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
1c8a0 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
1c8b0 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
1c8c0 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
1c8d0 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
1c8e0 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
1c8f0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
1c900 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
1c910 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
1c920 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
1c930 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
1c940 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
1c950 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
1c960 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
1c970 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
1c980 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
1c990 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
1c9a0 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
1c9b0 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
1c9c0 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
1c9d0 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
1c9e0 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
1c9f0 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
1ca00 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
1ca10 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
1ca20 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1ca30 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
1ca40 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
1ca50 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
1ca60 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
1ca70 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
1ca80 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
1ca90 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1caa0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1cab0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1cac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
1cad0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1cae0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
1caf0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1cb00 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1cb10 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1cb20 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1cb30 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
1cb40 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1cb50 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1cb60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
1cb70 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
1cb80 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1cb90 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
1cba0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1cbb0 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20  ER_OPEN).  ){.  
1cbc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1cbd0 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20  gerSync(pPager, 
1cbe0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1cbf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cc00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1cc10 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1cc20 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
1cc30 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20  !='\0', 0);.    
1cc40 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1cc50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1cc60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cc70 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1cc80 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1cc90 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1cca0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1ccb0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1ccc0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1ccd0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1cce0 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1ccf0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1cd00 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1cd10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1cd20 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1cd30 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1cd40 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cd50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cd60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f  ;.  }.  if( isHo
1cd70 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29  t && nPlayback )
1cd80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
1cd90 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  g(SQLITE_NOTICE_
1cda0 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
1cdb0 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64 20  , "recovered %d 
1cdc0 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a  pages from %s",.
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65  nPlayback, pPage
1cdf0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
1ce00 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
1ce10 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1ce20 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
1ce30 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
1ce40 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
1ce50 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
1ce60 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1ce70 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
1ce80 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
1ce90 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
1cea0 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
1ceb0 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1cec0 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
1ced0 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
1cee0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1cef0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1cf00 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1cf10 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
1cf20 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1cf30 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f  se file and into
1cf40 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
1cf50 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
1cf60 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
1cf70 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
1cf80 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
1cf90 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1cfa0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1cfb0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
1cfc0 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
1cfd0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
1cfe0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1cff0 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
1d000 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
1d010 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d020 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
1d030 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1d040 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1d050 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1d060 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
1d070 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1d080 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1d090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1d0a0 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
1d0b0 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29  pPg, u32 iFrame)
1d0c0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1d0d0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1d0e0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1d0f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1d100 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50   page pPg */.  P
1d110 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
1d120 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50  pgno;       /* P
1d130 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  age number to re
1d140 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ad */.  int rc =
1d150 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1d160 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1d170 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ode */.  int pgs
1d180 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  z = pPager->page
1d190 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20  Size; /* Number 
1d1a0 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
1d1b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1d1c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1d1d0 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 21  AGER_READER && !
1d1e0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
1d1f0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1d200 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ->fd) );..#ifnde
1d210 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1d220 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20 29  L.  if( iFrame )
1d230 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20  {.    /* Try to 
1d240 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72  pull the page fr
1d250 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  om the write-ahe
1d260 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72  ad log. */.    r
1d270 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65  c = sqlite3WalRe
1d280 61 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  adFrame(pPager->
1d290 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67  pWal, iFrame, pg
1d2a0 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  sz, pPg->pData);
1d2b0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
1d2c0 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66    {.    i64 iOff
1d2d0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
1d2e0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1d2f0 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
1d300 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1d310 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44  ger->fd, pPg->pD
1d320 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73  ata, pgsz, iOffs
1d330 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  et);.    if( rc=
1d340 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1d350 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1d360 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d370 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1d380 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
1d390 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1d3a0 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64    /* If the read
1d3b0 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c   is unsuccessful
1d3c0 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65  , set the dbFile
1d3d0 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68  Vers[] to someth
1d3e0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ing.      ** tha
1d3f0 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  t will never be 
1d400 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72  a valid file ver
1d410 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72  sion.  dbFileVer
1d420 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20  s[] is a copy.  
1d430 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20      ** of bytes 
1d440 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
1d450 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32  tabase.  Bytes 2
1d460 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77  8..31 should alw
1d470 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ays be.      ** 
1d480 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65  zero or the size
1d490 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d4a0 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20   in page. Bytes 
1d4b0 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33  32..35 and 35..3
1d4c0 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c  9.      ** shoul
1d4d0 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72  d be page number
1d4e0 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65  s which are neve
1d4f0 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53  r 0xffffffff.  S
1d500 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20  o filling.      
1d510 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  ** pPager->dbFil
1d520 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c  eVers[] with all
1d530 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f 75   0xff bytes shou
1d540 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20  ld suffice..    
1d550 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
1d560 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64  r an encrypted d
1d570 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74  atabase, the sit
1d580 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63  uation is more c
1d590 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20  omplex:  bytes. 
1d5a0 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f       ** 24..39 o
1d5b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1d5c0 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20  re white noise. 
1d5d0 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69   But the probabi
1d5e0 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a  lity of.      **
1d5f0 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65   white noising e
1d600 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73  qualing 16 bytes
1d610 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69   of 0xff is vani
1d620 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f  shingly small so
1d630 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f  .      ** we sho
1d640 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e  uld still be ok.
1d650 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d660 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64  memset(pPager->d
1d670 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c  bFileVers, 0xff,
1d680 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1d690 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1d6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
1d6b0 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
1d6c0 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
1d6d0 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65  a)[24];.      me
1d6e0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1d6f0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
1d700 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61  Vers, sizeof(pPa
1d710 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1d720 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43  );.    }.  }.  C
1d730 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50  ODEC1(pPager, pP
1d740 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  g->pData, pgno, 
1d750 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  3, rc = SQLITE_N
1d760 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f  OMEM);..  PAGER_
1d770 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1d780 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
1d790 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
1d7a0 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
1d7b0 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
1d7c0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1d7d0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  , pgno));.  PAGE
1d7e0 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
1d7f0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1d800 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1d810 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1d820 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
1d830 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1d840 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  g)));..  return 
1d850 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64  rc;.}../*.** Upd
1d860 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ate the value of
1d870 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d880 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32  ter at offsets 2
1d890 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74  4 and 92 in.** t
1d8a0 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  he header and th
1d8b0 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e  e sqlite version
1d8c0 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65   number at offse
1d8d0 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t 96..**.** This
1d8e0 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69   is an unconditi
1d8f0 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65  onal update.  Se
1d900 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72  e also the pager
1d910 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1d920 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ter().** routine
1d930 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61   which only upda
1d940 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
1d950 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70  ounter if the up
1d960 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79  date is actually
1d970 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64  .** needed, as d
1d980 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1d990 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1d9a0 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76  ountDone state v
1d9b0 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1d9c0 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72  ic void pager_wr
1d9d0 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1d9e0 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  r(PgHdr *pPg){. 
1d9f0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
1da00 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  ter;..  /* Incre
1da10 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1da20 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1da30 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1da40 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
1da50 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
1da60 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
1da70 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  *)pPg->pPager->d
1da80 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20  bFileVers)+1;.  
1da90 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1daa0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34  *)pPg->pData)+24
1dab0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1dac0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74  );..  /* Also st
1dad0 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76  ore the SQLite v
1dae0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e  ersion number in
1daf0 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e   bytes 96..99 an
1db00 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20  d in.  ** bytes 
1db10 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65  92..95 store the
1db20 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1db30 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65  for which the ve
1db40 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a  rsion number.  *
1db50 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20  * is valid. */. 
1db60 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1db70 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39  r*)pPg->pData)+9
1db80 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  2, change_counte
1db90 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  r);.  put32bits(
1dba0 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1dbb0 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56  ta)+96, SQLITE_V
1dbc0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a  ERSION_NUMBER);.
1dbd0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1dbe0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1dbf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1dc00 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
1dc10 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61  or each page tha
1dc20 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1dc30 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  en .** written i
1dc40 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  nto the log file
1dc50 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e   when a WAL tran
1dc60 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1dc70 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d  d back..** Param
1dc80 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20  eter iPg is the 
1dc90 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  page number of s
1dca0 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43  aid page. The pC
1dcb0 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  tx argument .** 
1dcc0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
1dcd0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1dce0 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  er structure..**
1dcf0 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20  .** If page iPg 
1dd00 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
1dd10 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73  e cache, and has
1dd20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1dd30 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69  references,.** i
1dd40 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20  t is discarded. 
1dd50 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1dd60 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
1dd70 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a  ore outstanding.
1dd80 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  ** references, t
1dd90 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1dda0 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
1ddb0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
1ddc0 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74  f the.** attempt
1ddd0 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65   to reload conte
1dde0 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1ddf0 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64  base is required
1de00 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20   and fails, .** 
1de10 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1de20 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
1de30 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1de40 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1de50 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1de60 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50  ck(void *pCtx, P
1de70 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20  gno iPg){.  int 
1de80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1de90 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1dea0 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b  = (Pager *)pCtx;
1deb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1dec0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1ded0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1dee0 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1def0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1df00 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1df10 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1df20 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1df30 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1df40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1df50 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1df60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1df70 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20     u32 iFrame = 
1df80 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
1df90 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
1dfa0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1dfb0 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61  pPg->pgno, &iFra
1dfc0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
1dfd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dfe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
1dff0 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
1e000 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1e010 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e030 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1e040 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1e050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1e060 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
1e070 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1e080 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1e090 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1e0a0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1e0b0 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1e0c0 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1e0d0 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1e0e0 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1e0f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1e100 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1e110 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1e120 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1e130 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1e140 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1e150 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1e160 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1e170 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1e180 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1e190 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1e1a0 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1e1b0 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1e1c0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1e1d0 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1e1e0 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1e1f0 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1e200 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1e210 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1e220 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1e230 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1e240 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1e250 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1e260 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1e270 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1e280 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1e290 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e2a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e2b0 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1e2c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1e2d0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1e2e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e2f0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1e300 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e310 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e330 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1e340 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1e350 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1e360 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1e370 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1e380 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1e390 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1e3a0 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1e3b0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1e3c0 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1e3d0 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1e3e0 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1e3f0 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1e400 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1e410 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1e420 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1e430 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1e440 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1e450 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1e460 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1e470 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1e480 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1e490 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1e4a0 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1e4b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1e4c0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1e4d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1e4e0 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1e4f0 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1e500 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1e510 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1e520 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1e530 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1e540 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1e550 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1e560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e570 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1e580 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1e590 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1e5a0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1e5b0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1e5c0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1e5d0 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1e5e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1e5f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e600 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1e610 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1e620 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1e630 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1e640 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1e650 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1e660 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1e670 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1e680 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1e690 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1e6a0 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1e6b0 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1e6c0 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1e6d0 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1e6e0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1e6f0 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1e700 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1e710 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1e720 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1e730 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1e740 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1e750 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1e760 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1e770 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1e780 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1e790 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1e7a0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1e7b0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1e7c0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1e7d0 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1e7e0 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1e7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1e800 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1e810 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1e820 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1e830 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e840 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1e850 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1e860 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e880 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1e890 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b  s a commit */.){
1e8a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e8d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  e */.  int nList
1e8e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e8f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e900 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69   of pages in pLi
1e910 73 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  st */.#if define
1e920 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1e930 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1e940 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a 20  E_CHECK_PAGES). 
1e950 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1e980 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23 65  over pages */.#e
1e990 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1e9a0 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1e9b0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1e9c0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1e9d0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1e9e0 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1e9f0 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1ea00 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1ea10 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1ea20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1ea30 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1ea40 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1ea50 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1ea60 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1ea70 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1ea80 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69  ->pDirty==0 || i
1ea90 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28  sCommit );.  if(
1eaa0 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1eab0 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1eac0 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1ead0 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1eae0 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1eaf0 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1eb00 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1eb10 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1eb20 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1eb30 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1eb40 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1eb50 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1eb60 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1eb70 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1eb80 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1eb90 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1eba0 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1ebb0 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72  dr *p;.    PgHdr
1ebc0 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69   **ppNext = &pLi
1ebd0 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  st;.    nList = 
1ebe0 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  0;.    for(p=pLi
1ebf0 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70  st; (*ppNext = p
1ec00 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74  )!=0; p=p->pDirt
1ec10 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  y){.      if( p-
1ec20 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65  >pgno<=nTruncate
1ec30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65   ){.        ppNe
1ec40 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b  xt = &p->pDirty;
1ec50 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b  .        nList++
1ec60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ec70 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1ec80 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1ec90 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d    nList = 1;.  }
1eca0 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
1ecb0 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
1ecc0 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20  E] += nList;..  
1ecd0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
1ece0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
1ecf0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1ed00 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  List);.  rc = sq
1ed10 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
1ed20 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
1ed30 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
1ed40 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
1ed50 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
1ed60 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  , pPager->walSyn
1ed70 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66  cFlags.  );.  if
1ed80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ed90 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  && pPager->pBack
1eda0 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  up ){.    PgHdr 
1edb0 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c  *p;.    for(p=pL
1edc0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1edd0 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
1ede0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1edf0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1ee00 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
1ee10 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
1ee20 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
1ee30 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1ee40 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1ee50 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1ee60 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1ee70 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
1ee80 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1ee90 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  ){.    pager_set
1eea0 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
1eeb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1eec0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1eed0 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
1eee0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1eef0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
1ef00 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
1ef10 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
1ef20 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
1ef30 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
1ef40 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
1ef50 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
1ef60 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
1ef70 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
1ef80 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
1ef90 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
1efa0 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
1efb0 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
1efc0 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
1efd0 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
1efe0 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
1eff0 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
1f000 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1f010 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
1f020 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
1f030 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1f040 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f060 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1f070 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
1f080 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f090 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1f0a0 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
1f0b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1f0c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1f0d0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1f0e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1f0f0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
1f100 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1f110 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
1f120 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
1f130 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1f140 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
1f150 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
1f160 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
1f170 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
1f180 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
1f190 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
1f1a0 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
1f1b0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1f1c0 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
1f1d0 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
1f1e0 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
1f1f0 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
1f200 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
1f210 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
1f220 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1f230 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1f240 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
1f250 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
1f260 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1f270 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
1f280 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
1f290 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
1f2a0 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
1f2b0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1f2c0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
1f2d0 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
1f2e0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
1f2f0 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
1f300 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1f310 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1f320 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f330 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
1f340 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
1f350 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
1f360 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
1f370 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
1f380 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1f390 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f3a0 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
1f3b0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
1f3c0 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
1f3d0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
1f3e0 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
1f3f0 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
1f400 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
1f410 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1f420 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1f430 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1f440 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
1f450 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
1f460 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1f470 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
1f480 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1f490 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
1f4a0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
1f4b0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1f4c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1f4d0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1f4e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1f4f0 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
1f500 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f520 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1f530 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
1f540 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
1f550 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1f560 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1f570 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
1f580 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
1f590 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
1f5a0 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
1f5b0 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
1f5c0 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
1f5d0 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
1f5e0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f5f0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
1f600 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f610 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
1f620 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1f630 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
1f640 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
1f650 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
1f660 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
1f670 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
1f680 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
1f690 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f6a0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1f6b0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1f6c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1f6d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
1f6e0 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
1f6f0 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72  WalDbsize(pPager
1f700 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49  ->pWal);..  /* I
1f710 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1f720 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69  ize was not avai
1f730 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57  lable from the W
1f740 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20  AL sub-system,. 
1f750 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74   ** determine it
1f760 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
1f770 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f780 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
1f790 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
1f7a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1f7b0 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
1f7c0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1f7d0 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a   page-size,.  **
1f7e0 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74   round down to t
1f7f0 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e  he nearest page.
1f800 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
1f810 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a  e larger than 0.
1f820 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
1f830 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
1f840 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c   to contain at l
1f850 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20  east one page.. 
1f860 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d   */.  if( nPage=
1f870 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20  =0 ){.    i64 n 
1f880 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f890 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1f8a0 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79  of db file in by
1f8b0 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  tes */.    asser
1f8c0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1f8d0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1f8e0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1f8f0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1f900 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
1f910 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1f920 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1f930 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20  er->fd, &n);.   
1f940 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f950 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f960 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f970 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61   }.    }.    nPa
1f980 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70  ge = (Pgno)((n+p
1f990 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
1f9a0 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  1) / pPager->pag
1f9b0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
1f9c0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1f9d0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1f9e0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
1f9f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1fa00 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
1fa10 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
1fa20 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
1fa30 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
1fa40 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
1fa50 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
1fa60 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
1fa70 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
1fa80 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
1fa90 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
1faa0 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
1fab0 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
1fac0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1fad0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1fae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1faf0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
1fb00 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
1fb10 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
1fb20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1fb30 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
1fb40 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
1fb50 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1fb60 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
1fb70 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
1fb80 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
1fb90 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
1fba0 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
1fbb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1fbc0 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
1fbd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1fbe0 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
1fbf0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
1fc00 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
1fc10 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
1fc20 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
1fc30 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
1fc40 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
1fc50 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
1fc60 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
1fc70 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
1fc80 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
1fc90 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
1fca0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
1fcb0 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
1fcc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1fcd0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1fce0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1fcf0 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
1fd00 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
1fd10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fd20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
1fd30 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
1fd40 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
1fd50 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
1fd60 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
1fd70 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
1fd80 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
1fd90 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
1fda0 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
1fdb0 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
1fdc0 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
1fdd0 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
1fde0 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
1fdf0 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
1fe00 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
1fe10 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1fe20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1fe30 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
1fe40 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
1fe50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1fe60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1fe70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1fe80 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1fe90 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1fea0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1feb0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
1fec0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
1fed0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
1fee0 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
1fef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1ff00 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
1ff10 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e  xists */.    Pgn
1ff20 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1ff30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ff40 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1ff50 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
1ff60 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
1ff70 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
1ff80 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1ff90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1ffa0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1ffb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ffc0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
1ffd0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
1ffe0 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
1fff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20000 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
20010 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ENT ) rc = SQLIT
20020 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61  E_OK;.      isWa
20030 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
20040 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20050 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
20060 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20070 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
20080 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
20090 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c  S_EXISTS, &isWal
200a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
200b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
200c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
200d0 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
200e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
200f0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
20100 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
20110 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
20120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20130 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61  PagerOpenWal(pPa
20140 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ger, 0);.      }
20150 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
20160 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
20170 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20180 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WAL ){.        p
20190 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
201a0 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
201b0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20  ALMODE_DELETE;. 
201c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
201d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
201e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c  #endif../*.** Pl
201f0 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  ayback savepoint
20200 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c   pSavepoint. Or,
20210 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d   if pSavepoint==
20220 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62  NULL, then playb
20230 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  ack.** the entir
20240 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
20250 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20   file. The case 
20260 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
20270 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a   occurs when .**
20280 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63   a ROLLBACK TO c
20290 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65  ommand is invoke
202a0 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54  d on a SAVEPOINT
202b0 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73   that is a trans
202c0 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70  action .** savep
202d0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oint..**.** When
202e0 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e   pSavepoint is n
202f0 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67  ot NULL (meaning
20300 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69   a non-transacti
20310 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
20320 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  .** being rolled
20330 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65   back), then the
20340 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73   rollback consis
20350 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65  ts of up to thre
20360 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72  e stages,.** per
20370 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72  formed in the or
20380 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a  der specified:.*
20390 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
203a0 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  re played back f
203b0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
203c0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
203d0 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66   byte.**     off
203e0 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  set PagerSavepoi
203f0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
20400 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a  ontinuing to .**
20410 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
20420 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20  int.iHdrOffset, 
20430 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
20440 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20450 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66  l.**     file if
20460 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20470 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65  iHdrOffset is ze
20480 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ro..**.**   * If
20490 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
204a0 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f  iHdrOffset is no
204b0 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67  t zero, then pag
204c0 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a  es are played.**
204d0 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69       back starti
204e0 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
204f0 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64  nal header immed
20500 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
20510 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
20520 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
20530 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  et to the end of
20540 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20550 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  l file..**.**   
20560 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e  * Pages are then
20570 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
20580 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
20590 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67  l file, starting
205a0 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65  .**     with the
205b0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
205c0 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74  iSubRec and cont
205d0 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e  inuing to the en
205e0 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20  d of.**     the 
205f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
20600 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74  .** Throughout t
20610 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63  he rollback proc
20620 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61  ess, each time a
20630 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20   page is rolled 
20640 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72  back, the.** cor
20650 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
20660 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65  s set in a bitve
20670 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72  c structure (var
20680 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74  iable pDone in t
20690 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  he.** implementa
206a0 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69  tion below). Thi
206b0 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73  s is used to ens
206c0 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20  ure that a page 
206d0 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65  is only.** rolle
206e0 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74  d back the first
206f0 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
20700 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65  untered in eithe
20710 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  r journal..**.**
20720 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69   If pSavepoint i
20730 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67  s NULL, then pag
20740 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79  es are only play
20750 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20760 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
20770 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20   file. There is 
20780 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69  no need for a bi
20790 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73  tvec in this cas
207a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68  e..**.** In eith
207b0 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20  er case, before 
207c0 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63  playback commenc
207d0 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53  es the Pager.dbS
207e0 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
207f0 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20  is reset to the 
20800 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65  value that it he
20810 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ld at the start 
20820 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  of the savepoint
20830 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63   .** (or transac
20840 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77  tion). No page w
20850 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65  ith a page-numbe
20860 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
20870 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  his value.** is 
20880 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20  played back. If 
20890 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  one is encounter
208a0 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20  ed it is simply 
208b0 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
208c0 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79  ic int pagerPlay
208d0 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61  backSavepoint(Pa
208e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67  ger *pPager, Pag
208f0 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
20900 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20  vepoint){.  i64 
20910 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
20920 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76       /* Effectiv
20930 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
20940 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
20950 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
20960 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
20970 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74  of first segment
20980 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c   of main-journal
20990 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   records */.  in
209a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
209b0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
209c0 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65   code */.  Bitve
209d0 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20  c *pDone = 0;   
209e0 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f      /* Bitvec to
209f0 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c   ensure pages pl
20a00 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f  ayed back only o
20a10 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  nce */..  assert
20a20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20a30 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
20a40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20a50 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
20a60 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
20a70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
20a80 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
20a90 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
20aa0 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
20ab0 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
20ac0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
20ad0 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
20ae0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
20af0 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
20b00 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
20b10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20b20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20b30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
20b40 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
20b50 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
20b60 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
20b70 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
20b80 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
20b90 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
20ba0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
20bb0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
20bc0 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
20bd0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
20be0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
20bf0 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
20c00 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
20c10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
20c20 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
20c30 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  t && pagerUseWal
20c40 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
20c50 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c  return pagerRoll
20c60 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b  backWal(pPager);
20c70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70  .  }..  /* Use p
20c80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20c90 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69  f as the effecti
20ca0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
20cb0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
20cc0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  * journal.  The 
20cd0 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68  actual file migh
20ce0 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
20cf0 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41   this in.  ** PA
20d00 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20d10 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45  TRUNCATE or PAGE
20d20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
20d30 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74  RSIST.  But anyt
20d40 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70  hing.  ** past p
20d50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20d60 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20  f is off-limits 
20d70 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a  to us..  */.  sz
20d80 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
20d90 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  nalOff;.  assert
20da0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
20db0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d  ager)==0 || szJ=
20dc0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
20dd0 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63  n by rolling bac
20de0 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  k records from t
20df0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20e00 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
20e10 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20e20 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
20e30 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inuing to the ne
20e40 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
20e50 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69  r..  ** There mi
20e60 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69  ght be records i
20e70 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
20e80 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70  al that have a p
20e90 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
20ea0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
20eb0 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
20ec0 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e  e size (pPager->
20ed0 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73  dbSize) but thos
20ee0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  e.  ** will be s
20ef0 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63  kipped automatic
20f00 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65  ally.  Pages are
20f10 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20   added to pDone 
20f20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65  as they.  ** are
20f30 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
20f40 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
20f50 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65  int && !pagerUse
20f60 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
20f70 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
20f80 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
20f90 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
20fa0 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
20fb0 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
20fc0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
20fd0 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
20fe0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
20ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21000 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21010 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
21020 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21030 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21040 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21050 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21060 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21070 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21080 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
210a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
210b0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
210c0 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
210d0 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
210e0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
210f0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
21100 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
21110 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
21120 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
21130 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
21140 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
21150 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21160 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
21170 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
21180 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
21190 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
211a0 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
211b0 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
211c0 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
211d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
211e0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
211f0 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
21200 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
21210 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21220 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
21230 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
21240 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
21250 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
21260 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
21270 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
21280 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
21290 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
212a0 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
212b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
212c0 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
212d0 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
212e0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
212f0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21300 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21310 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
21320 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
21330 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
21340 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
21350 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
21360 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
21370 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
21380 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
21390 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
213a0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
213b0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
213c0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
213d0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
213e0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
213f0 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
21400 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
21410 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
21420 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
21430 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
21440 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
21450 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
21460 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
21470 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
21480 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
21490 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
214a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
214b0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
214c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
214d0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
214e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
214f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21500 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
21510 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21520 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
21530 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b  urnalOff>=szJ );
21540 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
21550 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
21560 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
21570 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
21580 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
21590 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
215a0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
215b0 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
215c0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
215d0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
215e0 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
215f0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
21600 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
21610 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21620 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
21630 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
21640 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21650 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
21660 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69   = (i64)pSavepoi
21670 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
21680 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21690 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
216a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
216b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
216c0 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
216d0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
216e0 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61  l, pSavepoint->a
216f0 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  WalData);.    }.
21700 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
21710 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
21720 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21730 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
21740 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
21750 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
21760 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61  ==(i64)ii*(4+pPa
21770 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
21780 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
21790 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
217a0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
217b0 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
217c0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
217d0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
217e0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
217f0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
21800 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
21810 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21820 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21830 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
21840 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
21850 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
21860 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
21870 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
21880 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
21890 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
218a0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
218b0 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
218c0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
218d0 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
218e0 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
218f0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
21900 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
21910 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53  ../*.** Invoke S
21920 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
21930 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74  _SIZE based on t
21940 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
21950 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73   of szMmap..*/.s
21960 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
21970 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65  FixMaplimit(Page
21980 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20  r *pPager){.#if 
21990 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
219a0 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33  SIZE>0.  sqlite3
219b0 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
219c0 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73  er->fd;.  if( is
219d0 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e  Open(fd) && fd->
219e0 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
219f0 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c  on>=3 ){.    sql
21a00 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20  ite3_int64 sz;. 
21a10 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e     sz = pPager->
21a20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67  szMmap;.    pPag
21a30 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20  er->bUseFetch = 
21a40 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69  (sz>0);.    sqli
21a50 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
21a60 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
21a70 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
21a80 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20  AP_SIZE, &sz);. 
21a90 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
21aa0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
21ab0 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e  ximum size of an
21ac0 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  y memory mapping
21ad0 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61 74   made of the dat
21ae0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76  abase file..*/.v
21af0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
21b00 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67  SetMmapLimit(Pag
21b10 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69  er *pPager, sqli
21b20 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
21b30 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d  ){.  pPager->szM
21b40 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20  map = szMmap;.  
21b50 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
21b60 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
21b70 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68 20  ** Free as much 
21b80 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
21b90 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  le from the page
21ba0 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
21bb0 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61  e3PagerShrink(Pa
21bc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21bd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 72  sqlite3PcacheShr
21be0 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ink(pPager->pPCa
21bf0 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  che);.}../*.** A
21c00 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73 20 6f  djust settings o
21c10 66 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  f the pager to t
21c20 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 69  hose specified i
21c30 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20 70 61  n the pgFlags pa
21c40 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
21c50 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20 70 67  he "level" in pg
21c60 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
21c70 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73  NCHRONOUS_MASK s
21c80 65 74 73 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ets the robustne
21c90 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ss.** of the dat
21ca0 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
21cb0 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
21cc0 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  s or power failu
21cd0 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69  res by.** changi
21ce0 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
21cf0 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
21d00 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
21d10 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72  als..** There ar
21d20 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
21d30 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
21d40 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
21d50 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
21d60 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
21d70 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
21d80 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
21d90 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
21da0 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
21db0 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
21dc0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
21dd0 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
21de0 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
21df0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
21e00 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
21e10 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
21e20 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
21e30 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
21e40 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
21e50 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
21e60 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
21e70 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
21e90 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
21ea0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
21eb0 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
21ec0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
21ed0 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
21ee0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
21ef0 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
21f00 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
21f10 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
21f20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
21f30 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
21f40 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
21f50 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
21f60 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
21f70 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
21f90 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
21fa0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
21fb0 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
21fc0 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
21fd0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
21fe0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
21ff0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
22000 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
22010 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
22020 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
22030 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
22040 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
22050 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
22060 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
22070 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
22080 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
220a0 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
220b0 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
220c0 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
220d0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
220e0 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
220f0 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
22100 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
22110 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
22120 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
22130 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d   for a rollback-
22140 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46  journal mode.  F
22150 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46  or WAL mode, OFF
22160 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f   continues.** to
22170 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79   mean that no sy
22180 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20  ncs ever occur. 
22190 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68   NORMAL means th
221a0 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79  at the WAL is sy
221b0 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  nced.** prior to
221c0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68   the start of ch
221d0 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61  eckpoint and tha
221e0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
221f0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  ile is synced.**
22200 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
22210 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  on of the checkp
22220 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69  oint if the enti
22230 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  re content of th
22240 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69  e WAL.** was wri
22250 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
22260 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  he database.  Bu
22270 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74  t no sync operat
22280 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a  ions occur for.*
22290 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f  * an ordinary co
222a0 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d  mmit in NORMAL m
222b0 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46  ode with WAL.  F
222c0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
222d0 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69  he WAL.** file i
222e0 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  s synced followi
222f0 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ng each commit o
22300 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64  peration, in add
22310 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ition to the.** 
22320 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64  syncs associated
22330 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a   with NORMAL..**
22340 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75  .** Do not confu
22350 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  se synchronous=F
22360 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ULL with SQLITE_
22370 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a  SYNC_FULL.  The.
22380 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  ** SQLITE_SYNC_F
22390 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20  ULL macro means 
223a0 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53  to use the MacOS
223b0 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79  X-style full-fsy
223c0 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74  nc.** using fcnt
223d0 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20  l(F_FULLFSYNC). 
223e0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
223f0 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  MAL means to do 
22400 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66  an.** ordinary f
22410 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68  sync() call.  Th
22420 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
22430 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c  ence between SQL
22440 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a  ITE_SYNC_FULL.**
22450 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43   and SQLITE_SYNC
22460 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66  _NORMAL on platf
22470 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20  orms other than 
22480 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65  MacOSX.  But the
22490 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  .** synchronous=
224a0 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63  FULL versus sync
224b0 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73  hronous=NORMAL s
224c0 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65  etting determine
224d0 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53  s when.** the xS
224e0 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73  ync primitive is
224f0 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72   called and is r
22500 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70  elevant to all p
22510 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  latforms..**.** 
22520 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
22530 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
22540 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
22550 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
22560 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
22570 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22580 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
22590 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
225a0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
225b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
225c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
225d0 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66  pager to set saf
225e0 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f  ety level for */
225f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
22600 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69  ags      /* Vari
22610 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  ous flags */.){.
22620 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c    unsigned level
22630 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41 47   = pgFlags & PAG
22640 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
22650 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ASK;.  assert( l
22660 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c  evel>=1 && level
22670 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  <=3 );.  pPager-
22680 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
22690 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
226a0 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
226b0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
226c0 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
226d0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
226e0 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28  ile) ?1:0;.  if(
226f0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
22700 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
22710 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
22720 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
22730 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  ncFlags = 0;.  }
22740 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73  else if( pgFlags
22750 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59   & PAGER_FULLFSY
22760 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
22770 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
22780 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22790 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
227a0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
227b0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
227c0 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67  }else if( pgFlag
227d0 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46  s & PAGER_CKPT_F
227e0 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20  ULLFSYNC ){.    
227f0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22800 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22810 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
22820 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
22830 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22840 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  FULL;.  }else{. 
22850 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22860 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22870 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
22880 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22890 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
228a0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
228b0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
228c0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
228d0 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28  syncFlags;.  if(
228e0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
228f0 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22900 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
22910 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
22920 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66  CTIONS;.  }.  if
22930 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
22940 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a  R_CACHESPILL ){.
22950 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
22960 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
22970 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  FLAG_OFF;.  }els
22980 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  e{.    pPager->d
22990 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
229a0 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a  LLFLAG_OFF;.  }.
229b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
229c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
229d0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
229e0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
229f0 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
22a00 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
22a10 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
22a20 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
22a30 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
22a40 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
22a50 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
22a60 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
22a70 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
22a80 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
22a90 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
22aa0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
22ab0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
22ac0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
22ad0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
22ae0 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
22af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22b00 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
22b10 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
22b20 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
22b30 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
22b40 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
22b50 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
22b60 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
22b70 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
22b80 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
22b90 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
22ba0 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
22bb0 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
22bc0 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
22bd0 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
22be0 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
22bf0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
22c00 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
22c10 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
22c20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
22c30 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
22c40 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
22c50 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22c60 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
22c70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
22c80 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
22c90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
22ca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
22cb0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
22cc0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
22cd0 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
22ce0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
22cf0 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
22d00 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
22d10 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
22d20 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
22d30 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
22d40 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
22d50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22d60 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
22d70 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
22d80 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
22d90 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
22da0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
22db0 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
22dc0 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
22dd0 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
22de0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
22df0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
22e00 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
22e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
22e20 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
22e30 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
22e40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22e50 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
22e60 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
22e70 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
22e80 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22e90 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
22ea0 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
22eb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
22ec0 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
22ed0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
22ee0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
22ef0 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
22f00 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
22f10 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
22f20 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
22f30 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
22f40 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
22f50 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
22f60 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
22f70 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
22f80 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
22f90 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
22fa0 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
22fb0 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
22fc0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
22fd0 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
22fe0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
22ff0 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
23000 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
23010 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
23020 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
23030 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
23040 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
23050 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
23060 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
23070 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
230a0 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
230b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
230c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
230d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
230e0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
230f0 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
23100 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
23110 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
23120 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
23130 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
23140 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
23150 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
23160 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
23170 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
23180 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
23190 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
231a0 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
231b0 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
231c0 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
231d0 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
231e0 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
231f0 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
23200 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
23210 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
23220 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
23230 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
23240 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
23250 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
23260 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
23270 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
23280 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
23290 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
232a0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
232b0 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
232c0 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
232d0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
232e0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
232f0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
23300 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
23310 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
23320 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
23330 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
23340 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  dler */.){.  pPa
23350 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
23360 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
23370 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
23380 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
23390 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a  usyHandlerArg;..
233a0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
233b0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
233c0 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69  void **ap = (voi
233d0 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42  d **)&pPager->xB
233e0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
233f0 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29  assert( ((int(*)
23400 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29  (void *))(ap[0])
23410 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20  )==xBusyHandler 
23420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
23430 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c  p[1]==pBusyHandl
23440 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c  erArg );.    sql
23450 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
23460 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
23470 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42  , SQLITE_FCNTL_B
23480 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69  USYHANDLER, (voi
23490 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  d *)ap);.  }.}..
234a0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
234b0 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
234c0 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
234d0 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
234e0 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
234f0 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
23500 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
23510 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
23520 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
23530 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
23540 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
23550 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
23560 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
23570 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
23580 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
23590 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
235a0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20  QLITE_IOERR, an 
235b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78  SQLITE_IOERR_xxx
235c0 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c   sub-code or SQL
235d0 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
235e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
235f0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
23600 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
23610 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
23620 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
23630 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
23640 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
23650 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
23660 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
23670 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
23680 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
23690 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
236a0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
236b0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
236c0 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
236d0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
236e0 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
236f0 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
23700 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
23710 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
23720 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
23730 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
23740 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
23750 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
23760 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
23770 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
23780 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
23790 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
237a0 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
237b0 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
237c0 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
237d0 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
237e0 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
237f0 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
23800 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
23810 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
23820 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
23830 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
23840 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
23850 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
23860 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
23870 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
23880 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
23890 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
238a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
238b0 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
238c0 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
238d0 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
238e0 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
238f0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
23900 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
23910 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
23920 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
23930 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
23940 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
23950 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
23960 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
23970 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
23980 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
23990 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
239a0 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
239b0 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
239c0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
239d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
239e0 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
239f0 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50  *pPager, u32 *pP
23a00 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
23a10 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
23a20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
23a30 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
23a40 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66  ssible to do a f
23a50 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72  ull assert_pager
23a60 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61  _state() here, a
23a70 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
23a80 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
23a90 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50  ed from within P
23aa0 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f  agerOpen(), befo
23ab0 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  re the state.  *
23ac0 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  * of the Pager o
23ad0 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61  bject is interna
23ae0 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a  lly consistent..
23af0 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65    **.  ** At one
23b00 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63   point this func
23b10 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e  tion returned an
23b20 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61   error if the pa
23b30 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a  ger was in .  **
23b40 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
23b50 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41  te. But since PA
23b60 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20  GER_ERROR state 
23b70 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
23b80 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74    ** there is at
23b90 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
23ba0 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
23bb0 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63  rence, this func
23bc0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e  tion.  ** is a n
23bd0 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61  o-op for that ca
23be0 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a  se anyhow..  */.
23bf0 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20  .  u32 pageSize 
23c00 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
23c10 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
23c20 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
23c30 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
23c40 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
23c50 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66  GE_SIZE) );.  if
23c60 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( (pPager->memDb
23c70 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
23c80 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20  bSize==0).   && 
23c90 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
23ca0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
23cb0 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26  Cache)==0 .   &&
23cc0 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
23cd0 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67  eSize!=(u32)pPag
23ce0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
23cf0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
23d00 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  w = NULL;       
23d10 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d        /* New tem
23d20 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  p space */.    i
23d30 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20  64 nByte = 0;.. 
23d40 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
23d50 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
23d60 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
23d70 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
23d80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
23d90 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
23da0 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
23db0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
23dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23dd0 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29   pNew = (char *)
23de0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
23df0 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
23e00 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72     if( !pNew ) r
23e10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23e20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
23e30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23e40 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
23e50 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
23e60 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
23e70 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74  e = (Pgno)((nByt
23e80 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61  e+pageSize-1)/pa
23e90 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
23ea0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
23eb0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
23ec0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
23ed0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
23ee0 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ace);.      pPag
23ef0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
23f00 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71 6c 69  pNew;.      sqli
23f10 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
23f20 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
23f30 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
23f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
23f50 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
23f60 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
23f70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23f80 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73   ){.    if( nRes
23f90 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
23fa0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
23fb0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
23fc0 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
23fd0 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
23fe0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
23ff0 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
24000 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
24010 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
24020 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69  er);.    pagerFi
24030 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72  xMaplimit(pPager
24040 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24050 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
24060 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24070 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
24080 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
24090 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
240a0 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
240b0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
240c0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
240d0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
240e0 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
240f0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
24100 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
24110 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
24120 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
24130 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
24140 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
24150 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
24160 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
24170 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
24180 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
24190 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
241a0 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
241b0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
241c0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
241d0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
241e0 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
241f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
24200 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
24210 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
24220 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
24230 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
24240 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
24250 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
24260 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
24270 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
24280 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
24290 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
242a0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
242b0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
242c0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
242d0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
242e0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
242f0 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
24300 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
24310 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
24320 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
24330 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
24340 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
24350 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
24360 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
24370 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
24380 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
24390 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
243a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
243b0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20  =PAGER_OPEN );  
243c0 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e      /* Called on
243d0 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e  ly by OP_MaxPgcn
243e0 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
243f0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70  Pager->mxPgno>=p
24400 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
24410 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74    /* OP_MaxPgcnt
24420 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a   enforces this *
24430 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  /.  return pPage
24440 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
24450 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
24460 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
24470 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
24480 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
24490 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
244a0 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
244b0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
244c0 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
244d0 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
244e0 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
244f0 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
24500 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
24510 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
24520 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
24530 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
24540 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
24550 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
24560 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
24570 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
24580 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
24590 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
245a0 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
245b0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
245c0 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
245d0 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
245e0 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
245f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
24600 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
24610 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
24620 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
24630 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24640 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
24650 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
24660 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24670 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
24680 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24690 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
246a0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
246b0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
246c0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
246d0 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
246e0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
246f0 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
24700 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
24710 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
24720 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
24730 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
24740 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
24750 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
24760 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
24770 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
24780 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
24790 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
247a0 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
247b0 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
247c0 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
247d0 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
247e0 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
247f0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
24800 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
24810 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
24820 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
24830 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
24840 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
24850 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
24860 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
24870 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
24880 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
24890 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
248a0 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
248b0 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
248c0 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
248d0 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
248e0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
248f0 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
24900 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
24910 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
24920 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
24930 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
24940 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
24950 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
24960 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
24970 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
24980 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
24990 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
249a0 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
249b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
249c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
249d0 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
249e0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
249f0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
24a00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
24a10 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   );..  /* This r
24a20 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
24a30 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69  alled by btree i
24a40 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
24a50 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
24a60 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
24a70 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20    There has not 
24a80 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  been an opportun
24a90 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ity to transitio
24aa0 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f  n.  ** to WAL mo
24ab0 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  de yet..  */.  a
24ac0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
24ad0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
24ae0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24af0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24b00 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
24b10 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
24b20 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
24b30 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
24b40 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
24b50 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
24b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
24b70 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
24b80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24b90 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
24ba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24bb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24bc0 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ion may only be 
24bd0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65  called when a re
24be0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
24bf0 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  s open on.** the
24c00 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72   pager. It retur
24c10 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
24c20 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
24c30 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
24c40 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
24c50 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77  the file is betw
24c60 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d  een 1 and <page-
24c70 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73  size> bytes in s
24c80 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ize, then .** th
24c90 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  is is considered
24ca0 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a   a 1 page file..
24cb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
24cc0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
24cd0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
24ce0 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73   *pnPage){.  ass
24cf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24d00 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
24d10 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
24d20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
24d30 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
24d40 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67  SHED );.  *pnPag
24d50 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d  e = (int)pPager-
24d60 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  >dbSize;.}.../*.
24d70 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
24d80 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
24d90 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20  locktype on the 
24da0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24db0 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f  f.** a similar o
24dc0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
24dd0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
24de0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
24df0 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74   a no-op.** (ret
24e00 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
24e10 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a   immediately)..*
24e20 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
24e30 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
24e40 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  n the lock using
24e50 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
24e60 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65  . Invoke .** the
24e70 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
24e80 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75  f the lock is cu
24e90 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
24ea0 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a  lable. Repeat .*
24eb0 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  * until the busy
24ec0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
24ed0 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  s false or until
24ee0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
24ef0 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  .** obtain the l
24f00 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
24f10 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
24f20 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
24f30 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
24f40 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
24f50 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
24f60 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  k. If the lock i
24f70 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65  s obtained succe
24f80 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65  ssfully, set the
24f90 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a   Pager.state .**
24fa0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63   variable to loc
24fb0 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74  ktype before ret
24fc0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
24fd0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
24fe0 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
24ff0 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
25000 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25030 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
25040 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
25050 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
25060 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
25070 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
25080 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
25090 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e  eady held, or on
250a0 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73  e of the transis
250b0 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
250c0 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
250d0 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
250e0 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
250f0 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
25100 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
25110 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
25120 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
25130 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
25140 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70  ->eLock>=locktyp
25150 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
25160 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
25170 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
25180 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
25190 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
251a0 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
251b0 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  D_LOCK && lockty
251c0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
251d0 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b  CK).  );..  do {
251e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c  .    rc = pagerL
251f0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f  ockDb(pPager, lo
25200 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  cktype);.  }whil
25210 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
25220 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
25230 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
25240 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
25250 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  rg) );.  return 
25260 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  rc;.}../*.** Fun
25270 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e  ction assertTrun
25280 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
25290 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68  Pager) checks th
252a0 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a  at one of the .*
252b0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  * following is t
252c0 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74  rue for all dirt
252d0 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  y pages currentl
252e0 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  y in the page-ca
252f0 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  che:.**.**   a) 
25300 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
25310 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
25320 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a  equal to the siz
25330 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  e of the .**    
25340 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61    current databa
25350 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67  se image, in pag
25360 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62  es, OR.**.**   b
25370 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f  ) if the page co
25380 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74  ntent were writt
25390 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  en at this time,
253a0 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a   it would not.**
253b0 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61        be necessa
253c0 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
253d0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20  current content 
253e0 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  out to the sub-j
253f0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28  ournal.**      (
25400 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
25410 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65   function subjRe
25420 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a  quiresPage())..*
25430 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64  *.** If the cond
25440 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62  ition asserted b
25450 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
25460 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
25470 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  nd the.** dirty 
25480 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20  page were to be 
25490 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74  discarded from t
254a0 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65  he cache via the
254b0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a   pagerStress().*
254c0 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72  * routine, pager
254d0 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e  Stress() would n
254e0 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72  ot write the cur
254f0 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
25500 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61  t to.** the data
25510 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20  base file. If a 
25520 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
25530 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65  ction were rolle
25540 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20  d back after.** 
25550 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74  this happened, t
25560 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
25570 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ior would be to 
25580 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
25590 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
255a0 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
255b0 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
255c0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
255d0 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
255e0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
255f0 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
25600 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
25610 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
25620 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
25630 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
25640 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
25650 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
25660 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
25670 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
25680 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
25690 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
256a0 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
256b0 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
256c0 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
256d0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
256e0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
256f0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
25700 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25710 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
25720 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
25730 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
25740 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
25750 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
25760 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
25770 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
25780 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
25790 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
257a0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
257b0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
257c0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
257d0 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
257e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
257f0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25800 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
25810 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
25820 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25830 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
25840 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
25850 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
25860 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
25870 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
25880 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
25890 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
258a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
258b0 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
258c0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
258d0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
258e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
258f0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
25900 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
25910 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
25920 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
25930 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
25940 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
25950 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
25960 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25970 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67   only called rig
25980 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
25990 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
259a0 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  on..** Once this
259b0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
259c0 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74  en called, the t
259d0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
259e0 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c  either be.** rol
259f0 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  led back or comm
25a00 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74  itted. It is not
25a10 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68   safe to call th
25a20 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  is function and.
25a30 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65  ** then continue
25a40 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
25a50 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
25a60 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
25a70 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
25a80 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
25a90 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
25aa0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
25ab0 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
25ac0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25ad0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
25ae0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
25af0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
25b00 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74   nPage;..  /* At
25b10 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63   one point the c
25b20 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20  ode here called 
25b30 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25b40 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20  nstraint() to.  
25b50 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  ** ensure that a
25b60 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74  ll pages being t
25b70 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79  runcated away by
25b80 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
25b90 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  are,.  ** if one
25ba0 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
25bb0 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72  nts are open, pr
25bc0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76  esent in the sav
25bd0 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75  epoint .  ** jou
25be0 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  rnal so that the
25bf0 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
25c00 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69  d if the savepoi
25c10 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a  nt is rolled.  *
25c20 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  * back. This is 
25c30 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73  no longer necess
25c40 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63  ary as this func
25c50 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79  tion is now only
25c60 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67  .  ** called rig
25c70 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
25c80 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
25c90 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20  on. So although 
25ca0 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
25cb0 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c  object may still
25cc0 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70   have open savep
25cd0 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61  oints (Pager.nSa
25ce0 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20  vepoint!=0), .  
25cf0 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62  ** they cannot b
25d00 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53  e rolled back. S
25d10 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e  o the assertTrun
25d20 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
25d30 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f   call.  ** is no
25d40 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e   longer correct.
25d50 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.}.../*.** Th
25d60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
25d70 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
25d80 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
25d90 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
25da0 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
25db0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
25dc0 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
25dd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
25de0 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
25df0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
25e00 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
25e10 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
25e20 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
25e30 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
25e40 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
25e50 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
25e60 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
25e70 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
25e80 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
25e90 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
25ea0 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
25eb0 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
25ec0 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
25ed0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
25ee0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
25ef0 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
25f00 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
25f10 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
25f20 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
25f30 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
25f40 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
25f50 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
25f60 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
25f70 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
25f80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
25f90 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
25fa0 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
25fb0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
25fc0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
25fd0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
25fe0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
25ff0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26000 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
26010 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
26020 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26030 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
26040 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
26050 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
26060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26070 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26080 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
26090 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
260a0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
260b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
260c0 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  ../*.** Obtain a
260d0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
260e0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  memory mapped pa
260f0 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61  ge object for pa
26100 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20  ge number pgno. 
26110 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
26120 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20  ct will use the 
26130 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f  pointer pData, o
26140 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65  btained from xFe
26150 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63  tch()..** If suc
26160 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70  cessful, set *pp
26170 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Page to point to
26180 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65   the new page re
26190 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72  ference.** and r
261a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
261b0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
261c0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
261d0 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a  or code and set.
261e0 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65  ** *ppPage to ze
261f0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72  ro..**.** Page r
26200 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e  eferences obtain
26210 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
26220 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
26230 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a  ld be released.*
26240 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67  * by calling pag
26250 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
26260 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
26270 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  t pagerAcquireMa
26280 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  pPage(.  Pager *
26290 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
262a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
262b0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
262c0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
262e0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
262f0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20    void *pData,  
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26310 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20    /* xFetch()'d 
26320 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61  data for this pa
26330 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  ge */.  PgHdr **
26340 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20  ppPage          
26350 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26360 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62  Acquired page ob
26370 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  ject */.){.  PgH
26380 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
263a0 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  Memory mapped pa
263b0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ge to return */.
263c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
263d0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
263e0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
263f0 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
26400 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
26410 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26420 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
26430 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
26440 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  0;.    memset(p-
26450 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67  >pExtra, 0, pPag
26460 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d  er->nExtra);.  }
26470 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
26480 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
26490 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
264a0 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
264b0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
264c0 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
264d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
264e0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
264f0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
26500 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
26510 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
26520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26530 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
26540 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
26550 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
26560 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
26570 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
26580 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
26590 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
265a0 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
265b0 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
265c0 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
265d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
265e0 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
265f0 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
26600 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
26610 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
26620 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
26630 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
26640 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
26650 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
26660 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
26670 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
26680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26690 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  OK;.}../*.** Rel
266a0 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
266b0 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50   to page pPg. pP
266c0 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
266d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
266e0 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  .** earlier call
266f0 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65   to pagerAcquire
26700 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
26710 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
26720 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67  eleaseMapPage(Pg
26730 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
26740 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
26750 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67  ->pPager;.  pPag
26760 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a  er->nMmapOut--;.
26770 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
26780 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26790 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  elist;.  pPager-
267a0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
267b0 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28   pPg;..  assert(
267c0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
267d0 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
267e0 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  =3 );.  sqlite3O
267f0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
26800 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e  >fd, (i64)(pPg->
26810 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
26820 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70  pageSize, pPg->p
26830 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
26840 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f  Free all PgHdr o
26850 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e  bjects stored in
26860 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70   the Pager.pMmap
26870 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a  Freelist list..*
26880 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26890 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50  gerFreeMapHdrs(P
268a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
268b0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48   PgHdr *p;.  PgH
268c0 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  dr *pNext;.  for
268d0 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  (p=pPager->pMmap
268e0 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70  Freelist; p; p=p
268f0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
26900 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
26910 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26920 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
26930 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
26940 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
26950 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
26960 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
26970 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
26980 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
26990 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
269a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
269b0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
269c0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
269d0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
269e0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
269f0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
26a00 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
26a10 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
26a20 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
26a30 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
26a40 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
26a50 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
26a60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
26a70 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
26a80 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
26a90 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
26aa0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26ab0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
26ac0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
26ad0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
26ae0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
26af0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
26b00 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
26b10 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
26b20 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
26b30 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
26b40 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
26b50 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
26b60 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
26b70 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
26b80 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
26b90 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
26ba0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26bb0 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a  u8 *pTmp = (u8 *
26bc0 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
26bd0 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  ce;..  assert( a
26be0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
26bf0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64  e(pPager) );.  d
26c00 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
26c10 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
26c20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
26c30 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61  gnMalloc();.  pa
26c40 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70  gerFreeMapHdrs(p
26c50 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61  Pager);.  /* pPa
26c60 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
26c70 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
26c80 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
26c90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26ca0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69  _OMIT_WAL.  sqli
26cb0 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
26cc0 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
26cd0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c  ->ckptSyncFlags,
26ce0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
26cf0 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67  e, pTmp);.  pPag
26d00 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
26d10 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
26d20 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
26d30 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
26d40 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
26d50 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
26d60 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
26d70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
26d80 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
26d90 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
26da0 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
26db0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
26dc0 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
26dd0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
26de0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
26df0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
26e00 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
26e10 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
26e20 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
26e30 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
26e40 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
26e50 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
26e60 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
26e70 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
26e80 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
26e90 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
26ea0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
26eb0 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
26ec0 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
26ed0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
26ee0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
26ef0 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
26f00 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
26f10 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
26f20 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
26f30 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
26f40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
26f50 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
26f60 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
26f70 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
26f80 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
26f90 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
26fa0 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
26fb0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
26fc0 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
26fd0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
26fe0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
26ff0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
27000 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27010 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
27020 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
27030 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
27040 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
27050 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
27060 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
27070 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
27080 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
27090 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
270a0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
270b0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
270c0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
270d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
270e0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
270f0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
27100 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
27110 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27120 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
27130 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
27140 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
27150 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
27160 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
27170 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
27180 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
27190 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
271a0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
271b0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
271c0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
271d0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
271e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
271f0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
27200 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
27210 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
27220 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
27230 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
27240 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
27250 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
27260 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
27270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27280 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
27290 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
272a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
272b0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
272c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
272d0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
272e0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
272f0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
27300 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
27310 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
27320 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
27330 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
27340 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
27350 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
27360 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
27370 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
27380 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
27390 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
273a0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
273b0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
273c0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
273d0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
273e0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
273f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27400 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
27410 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
27420 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
27430 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
27440 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
27450 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
27460 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27470 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
27480 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
27490 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
274a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
274b0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
274c0 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
274d0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
274e0 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
274f0 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
27500 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
27510 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
27520 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
27530 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
27540 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
27550 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
27560 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
27570 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
27580 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
27590 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
275a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
275b0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
275c0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
275d0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
275e0 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
275f0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
27600 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
27610 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
27620 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
27630 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
27640 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
27650 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
27660 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
27670 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
27680 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
27690 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
276a0 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
276b0 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
276c0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
276d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
276e0 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
276f0 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
27700 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
27710 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
27720 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
27730 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
27740 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
27750 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
27760 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
27770 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
27780 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
27790 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
277a0 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
277b0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
277c0 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
277d0 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
277e0 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
277f0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
27800 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
27810 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
27820 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
27830 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
27840 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
27850 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
27860 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
27870 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
27880 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
27890 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
278a0 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
278b0 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
278c0 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
278d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
278e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
278f0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
27900 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
27910 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
27920 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
27930 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
27940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
27950 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
27960 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
27970 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
279a0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
279b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
279c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
279d0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
279e0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
279f0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
27a00 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
27a10 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
27a20 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
27a30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
27a40 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
27a50 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
27a60 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
27a70 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
27a80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27a90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
27aa0 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
27ab0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
27ac0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27ad0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
27ae0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
27af0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
27b00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
27b10 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
27b20 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
27b30 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
27b40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
27b50 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
27b60 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
27b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
27b80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27b90 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
27ba0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
27bb0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
27bc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
27bd0 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
27be0 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
27bf0 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
27c00 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
27c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
27c20 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
27c30 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
27c40 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
27c50 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
27c60 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
27c70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
27c80 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
27c90 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
27ca0 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
27cb0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
27cc0 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
27cd0 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
27ce0 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
27cf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
27d00 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
27d10 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
27d20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
27d30 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
27d40 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
27d50 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63  ection's transac
27d60 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
27d70 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
27d80 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
27d90 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
27da0 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
27db0 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
27dc0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
27dd0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
27de0 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
27df0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
27e00 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
27e10 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
27e20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
27e30 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
27e40 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
27e50 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
27e60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
27e70 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
27e80 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
27e90 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
27ea0 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
27eb0 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
27ec0 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
27ed0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
27ee0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
27ef0 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
27f00 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
27f10 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
27f20 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
27f30 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
27f40 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
27f50 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
27f60 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
27f70 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
27f80 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
27f90 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
27fa0 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
27fb0 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
27fc0 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
27fd0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
27fe0 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
27ff0 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
28000 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
28010 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
28020 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28030 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
28040 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
28050 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
28060 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
28070 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
28080 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
28090 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
280a0 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
280b0 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
280c0 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
280d0 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
280e0 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
280f0 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
28100 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
28110 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
28120 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
28130 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
28140 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
28150 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
28160 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  c[8];.        u8
28170 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
28180 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
28190 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ];..        memc
281a0 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
281b0 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
281c0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
281d0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  );.        put32
281e0 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
281f0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
28200 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
28210 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
28220 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
28230 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
28240 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
28250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
28260 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
28270 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
28280 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
28290 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
282a0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
282b0 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
282c0 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
282d0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
282e0 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
282f0 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
28300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28310 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
28320 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
28330 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
28340 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
28350 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28360 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
28370 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
28380 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
28390 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
283a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
283b0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
283c0 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
283d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
283e0 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
283f0 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
28400 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
28410 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
28420 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
28430 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
28440 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
28450 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
28460 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
28470 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
28480 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
28490 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
284a0 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
284b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
284c0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
284d0 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
284e0 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
284f0 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
28500 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
28510 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
28520 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
28530 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
28540 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
28550 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
28560 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
28570 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
28580 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
28590 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
285a0 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
285b0 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
285c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
285d0 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
285e0 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
285f0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
28600 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
28610 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
28620 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
28630 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
28640 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
28650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
28660 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
28670 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
28680 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
28690 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
286a0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
286b0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
286c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
286d0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
286e0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
286f0 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
28700 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28710 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28720 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
28730 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
28740 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e  ("JHDR %p %lld\n
28750 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
28760 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b  r->journalHdr));
28770 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28780 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20  lite3OsWrite(.  
28790 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
287a0 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
287b0 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
287c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
287d0 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Hdr.        );. 
287e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
287f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28800 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
28810 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
28820 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
28830 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
28840 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28850 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
28860 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28870 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
28880 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28890 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
288a0 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
288b0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
288c0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
288d0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20  r->syncFlags| . 
288e0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
288f0 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c  ->syncFlags==SQL
28900 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
28910 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
28920 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
28930 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28950 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28960 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
28970 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
28980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
28990 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
289a0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
289b0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
289c0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
289d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
289e0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
289f0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
28a00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
28a10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28a20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28a30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28a40 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
28a50 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
28a60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28a80 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
28a90 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
28aa0 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
28ab0 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
28ac0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
28ad0 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
28ae0 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
28af0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28b00 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
28b10 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
28b20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
28b30 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
28b40 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
28b50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
28b60 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
28b70 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
28b80 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
28b90 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
28ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
28bc0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
28bd0 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
28be0 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
28bf0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
28c00 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
28c10 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
28c20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
28c30 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
28c40 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
28c50 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
28c60 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
28c70 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
28c80 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
28c90 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
28ca0 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
28cb0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
28cc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
28cd0 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
28ce0 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
28cf0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
28d00 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
28d10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
28d20 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
28d30 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
28d40 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
28d50 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
28d60 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
28d70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
28d80 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
28d90 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
28da0 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
28db0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
28dc0 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
28dd0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
28de0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28df0 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
28e00 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
28e10 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
28e20 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
28e30 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
28e40 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
28e50 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
28e60 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
28e70 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
28e80 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
28e90 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
28ea0 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
28eb0 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
28ec0 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
28ed0 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
28ee0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
28ef0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
28f00 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
28f10 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
28f20 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
28f30 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
28f40 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
28f50 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
28f60 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
28f70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
28f80 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
28f90 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
28fa0 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
28fb0 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
28fc0 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
28fd0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
28fe0 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
28ff0 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
29000 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
29010 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
29020 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
29030 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
29040 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
29050 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
29060 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
29070 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
29080 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
29090 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
290a0 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
290b0 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
290c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
290d0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
290e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
290f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
29100 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
29110 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
29120 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
29130 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
29140 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
29150 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
29160 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
29170 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
29180 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
29190 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
291a0 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
291b0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
291c0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
291d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
291f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
29200 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
29210 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
29220 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  led for rollback
29230 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45   pagers in WRITE
29240 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a  R_DBMOD state. *
29250 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
29260 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
29270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29280 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29290 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
292a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
292b0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
292c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
292d0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
292e0 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
292f0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
29300 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
29310 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
29320 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
29330 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
29340 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
29350 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
29360 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
29370 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
29380 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
29390 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
293a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
293b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
293c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
293d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
293e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
293f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
29400 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
29410 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
29420 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
29430 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
29440 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69  re the first wri
29450 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53  te, give the VFS
29460 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20   a hint of what 
29470 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66  the final.  ** f
29480 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  ile size will be
29490 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
294a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
294b0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
294c0 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63  >fd) );.  if( rc
294d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
294e0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  && pPager->dbHin
294f0 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  tSize<pPager->db
29500 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73  Size.   && (pLis
29510 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69  t->pDirty || pLi
29520 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  st->pgno>pPager-
29530 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29  >dbHintSize).  )
29540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
29550 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61  t64 szFile = pPa
29560 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  ger->pageSize * 
29570 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
29580 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
29590 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
295a0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
295b0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
295c0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
295d0 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
295e0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
295f0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
29600 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
29610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29620 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
29630 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
29640 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
29650 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
29660 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
29670 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
29680 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
29690 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
296a0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
296b0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
296c0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
296d0 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
296e0 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
296f0 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
29700 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
29710 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
29720 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
29730 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
29740 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
29750 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
29760 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
29770 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
29780 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
29790 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
297a0 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
297b0 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
297c0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
297d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
297e0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
297f0 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
29800 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
29810 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
29820 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
29830 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
29840 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
29850 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
29860 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
29870 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
298a0 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
298b0 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
298c0 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
298d0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
298e0 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
298f0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
29900 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
29910 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
29920 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  List);..      /*
29930 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
29940 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
29950 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
29960 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
29970 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
29980 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
29990 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
299a0 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
299b0 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
299c0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
299d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
299e0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
299f0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
29a00 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
29a10 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
29a20 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
29a30 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
29a40 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
29a50 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
29a60 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
29a70 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
29a80 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
29a90 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
29aa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29ab0 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
29ac0 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
29ad0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
29ae0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
29af0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
29b00 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
29b10 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
29b20 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
29b30 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
29b40 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
29b50 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
29b60 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
29b70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
29b80 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
29b90 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
29ba0 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
29bb0 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
29bc0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
29bd0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
29be0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
29bf0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
29c00 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
29c10 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
29c20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
29c30 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
29c40 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
29c50 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
29c60 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
29c70 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c90 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
29ca0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
29cb0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
29cc0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
29cd0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
29ce0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
29cf0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
29d00 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
29d10 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
29d20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29d30 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
29d40 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
29d50 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29d60 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
29d70 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
29d80 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
29d90 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
29da0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
29db0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
29dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
29dd0 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
29de0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
29df0 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
29e00 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
29e10 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
29e20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
29e30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29e40 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
29e50 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
29e60 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
29e70 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
29e80 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
29e90 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
29ea0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
29eb0 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
29ec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29ed0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
29ee0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29ef0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29f00 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
29f10 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
29f20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
29f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
29f40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
29f50 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
29f60 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
29f70 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
29f80 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
29f90 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
29fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29fb0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
29fc0 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
29fd0 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45  er->sjfd, SQLITE
29fe0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
29ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2a000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a010 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f  ** Append a reco
2a020 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  rd of the curren
2a030 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20  t state of page 
2a040 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  pPg to the sub-j
2a050 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69  ournal. .** It i
2a060 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
2a070 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20  sponsibility to 
2a080 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65 73  use subjRequires
2a090 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20  Page() to check 
2a0a0 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 72  .** that it is r
2a0b0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62  eally required b
2a0c0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
2a0d0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
2a0e0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2a0f0 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f  , set the bit co
2a100 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2a110 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20  Pg->pgno in the 
2a120 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61  bitvecs.** for a
2a130 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
2a140 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ts before return
2a150 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
2a160 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2a170 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
2a180 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2a190 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a  essful, an IO.**
2a1a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2a1b0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
2a1c0 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ite to the sub-j
2a1d0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
2a1e0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2a1f0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
2a200 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e  ils while settin
2a210 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76  g a bit in a sav
2a220 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63  epoint.** bitvec
2a230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a240 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50  subjournalPage(P
2a250 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
2a260 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a270 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2a280 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2a290 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
2a2a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2a2b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2a2c0 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  F ){..    /* Ope
2a2d0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2a2e0 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  l, if it has not
2a2f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
2a300 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65  ened */.    asse
2a310 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2a320 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
2a330 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2a340 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67  ger->jfd) || pag
2a350 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2a360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a370 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2a380 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2a390 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20  nSubRec==0 );.  
2a3a0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
2a3b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20  seWal(pPager) . 
2a3c0 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
2a3d0 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
2a3e0 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20   pPg) .         
2a3f0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2a400 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2a410 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2a420 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2a430 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2a440 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2a450 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2a460 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2a470 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2a480 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2a490 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2a4a0 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2a4b0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2a4c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a4d0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2a4e0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2a4f0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2a500 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2a510 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2a520 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2a530 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2a540 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
2a550 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
2a560 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
2a570 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a580 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
2a590 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a5a0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
2a5b0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2a5c0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2a5d0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
2a5e0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2a5f0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
2a600 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
2a610 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2a620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a630 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a640 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2a650 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
2a660 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2a670 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
2a680 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2a690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a6a0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2a6b0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
2a6c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a6d0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
2a6e0 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
2a6f0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2a700 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2a710 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2a720 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2a730 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2a740 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2a750 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2a760 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2a770 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2a780 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2a790 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2a7a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2a7b0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2a7c0 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2a7d0 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2a7e0 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2a7f0 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2a800 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2a810 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2a820 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2a830 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2a840 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2a850 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2a860 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2a870 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2a880 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2a890 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2a8a0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2a8b0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2a8c0 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2a8d0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2a8e0 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2a8f0 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2a900 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2a910 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2a920 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2a930 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2a940 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2a950 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2a960 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2a970 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2a980 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2a990 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2a9a0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2a9b0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2a9c0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2a9d0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2a9e0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2a9f0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2aa00 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2aa10 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2aa20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2aa30 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2aa40 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2aa50 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2aa60 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2aa70 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2aa80 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2aa90 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2aaa0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2aab0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2aac0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2aad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2aae0 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2aaf0 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2ab00 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2ab10 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2ab20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ab30 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2ab40 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2ab50 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2ab60 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2ab70 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2ab80 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
2ab90 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20  SYNC bit is set 
2aba0 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
2abb0 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
2abc0 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
2abd0 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
2abe0 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
2abf0 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
2ac00 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
2ac10 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
2ac20 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
2ac30 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
2ac40 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
2ac50 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
2ac60 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
2ac70 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
2ac80 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
2ac90 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f  l ROLLBACK and O
2aca0 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73  FF bits inhibits
2acb0 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2acc0 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c  ing.  ** regardl
2acd0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2ace0 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2acf0 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2ad00 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20  is set during.  
2ad10 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ** a rollback or
2ad20 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74   by user request
2ad30 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
2ad40 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2ad50 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2ad60 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2ad70 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2ad80 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2ad90 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2ada0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2adb0 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2adc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69   implementaton i
2add0 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
2ade0 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
2adf0 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74  3PcacheFetch() t
2ae00 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
2ae10 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20   createFlag==1. 
2ae20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
2ae30 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
2ae40 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
2ae50 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
2ae60 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
2ae70 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
2ae80 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
2ae90 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
2aea0 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
2aeb0 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
2aec0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
2aed0 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
2aee0 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
2aef0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ges..  */.  if( 
2af00 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2af10 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2af20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73  SQLITE_OK;.  tes
2af30 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2af40 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2af50 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29  LFLAG_ROLLBACK )
2af60 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2af70 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2af80 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46   & SPILLFLAG_OFF
2af90 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2afa0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2afb0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e  ll & SPILLFLAG_N
2afc0 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70  OSYNC );.  if( p
2afd0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2afe0 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72  l.   && ((pPager
2aff0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28  ->doNotSpill & (
2b000 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2b010 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  CK|SPILLFLAG_OFF
2b020 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28  ))!=0.      || (
2b030 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
2b040 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
2b050 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2b060 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2b070 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ..  pPg->pDirty 
2b080 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72  = 0;.  if( pager
2b090 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2b0a0 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  {.    /* Write a
2b0b0 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
2b0c0 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
2b0d0 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69  he log. */.    i
2b0e0 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2b0f0 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20  age(pPg) ){ .   
2b100 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2b110 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20  alPage(pPg); .  
2b120 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2b130 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b140 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
2b150 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
2b160 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Pg, 0, 0);.    }
2b170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
2b180 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
2b190 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
2b1a0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
2b1b0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2b1c0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20  DR_NEED_SYNC .  
2b1d0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
2b1e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2b1f0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
2b200 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
2b210 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
2b220 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 1);.    }.  . 
2b230 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
2b240 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73  e number of this
2b250 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20   page is larger 
2b260 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
2b270 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
2b280 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2b290 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20  ge, it may need 
2b2a0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
2b2b0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b2c0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
2b2d0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
2b2e0 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65  l to pager_write
2b2f0 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f  _pagelist() belo
2b300 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a  w will not.    *
2b310 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65  * actually write
2b320 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
2b330 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2b340 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f      **.    ** Co
2b350 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
2b360 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  wing sequence of
2b370 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a   events:.    **.
2b380 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a      **   BEGIN;.
2b390 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72      **     <jour
2b3a0 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20  nal page X>.    
2b3b0 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70  **     <modify p
2b3c0 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
2b3d0 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a    SAVEPOINT sp;.
2b3e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68      **       <sh
2b3f0 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69  rink database fi
2b400 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20  le to Y pages>. 
2b410 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65     **       page
2b420 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
2b430 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42      **     ROLLB
2b440 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a  ACK TO sp;.    *
2b450 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59  *.    ** If (X>Y
2b460 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67  ), then when pag
2b470 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c  erStress is call
2b480 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e  ed page X will n
2b490 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ot be written.  
2b4a0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20    ** out to the 
2b4b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62  database file, b
2b4c0 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70  ut will be dropp
2b4d0 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
2b4e0 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20  e. Then,.    ** 
2b4f0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52  following the "R
2b500 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73  OLLBACK TO sp" s
2b510 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e  tatement, readin
2b520 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65  g page X will re
2b530 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66  ad.    ** data f
2b540 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2b550 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c   file. This will
2b560 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20   be the copy of 
2b570 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20  page X as it.   
2b580 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65   ** was when the
2b590 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
2b5a0 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20  rted, not as it 
2b5b0 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f  was when "SAVEPO
2b5c0 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77  INT sp".    ** w
2b5d0 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  as executed..   
2b5e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
2b5f0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72  olution is to wr
2b600 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
2b610 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20  data for page X 
2b620 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
2b630 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2b640 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20  e now (if it is 
2b650 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72  not already ther
2b660 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77  e), so that it w
2b670 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  ill.    ** be re
2b680 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75  stored to its cu
2b690 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e  rrent value when
2b6a0 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
2b6b0 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a  O sp" is .    **
2b6c0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
2b6d0 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
2b6e0 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  .        rc==SQL
2b6f0 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70  ITE_OK && pPg->p
2b700 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  gno>pPager->dbSi
2b710 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  ze && subjRequir
2b720 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20  esPage(pPg).    
2b730 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2b740 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2b750 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Pg);.    }.  .  
2b760 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2b770 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2b780 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2b790 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2b7a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b7b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b7c0 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2b7d0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2b7e0 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2b7f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2b800 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2b810 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2b820 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2b830 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2b840 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2b850 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2b860 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2b870 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2b880 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2b890 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2b8a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2b8b0 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2b8c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2b8d0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2b8e0 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a  r, rc); .}.../*.
2b8f0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
2b900 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
2b910 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
2b920 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
2b930 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
2b940 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
2b950 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
2b960 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
2b970 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
2b980 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
2b990 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
2b9a0 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
2b9b0 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
2b9c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b9d0 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
2b9e0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
2b9f0 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
2ba00 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
2ba10 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
2ba20 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
2ba30 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
2ba40 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
2ba50 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
2ba60 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
2ba70 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
2ba80 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
2ba90 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
2baa0 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
2bab0 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
2bac0 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
2bad0 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
2bae0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2baf0 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
2bb00 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2bb10 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
2bb20 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
2bb30 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
2bb40 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
2bb50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2bb60 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
2bb70 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
2bb80 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
2bb90 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
2bba0 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
2bbb0 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
2bbc0 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2bbd0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
2bbe0 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
2bbf0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2bc00 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2bc10 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2bc20 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2bc30 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2bc40 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2bc50 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2bc60 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2bc70 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2bc80 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2bc90 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2bca0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2bcb0 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2bcc0 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2bcd0 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2bce0 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2bcf0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2bd00 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2bd10 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2bd20 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2bd30 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2bd40 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2bd50 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2bd60 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2bd70 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2bd80 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2bd90 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2bda0 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2bdb0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2bdc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2bdd0 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2bde0 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2bdf0 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2be00 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2be10 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2be20 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2be30 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2be40 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2be50 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2be60 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2be70 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2be80 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2be90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2bea0 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2beb0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2bec0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2bed0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2bee0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2bef0 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2bf00 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2bf10 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2bf20 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2bf30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2bf40 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2bf50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2bf60 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2bf70 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2bf90 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2bfa0 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2bfb0 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2bfc0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2bfd0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2bfe0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2bff0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2c000 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2c010 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2c020 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2c030 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2c040 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2c050 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2c060 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2c070 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2c080 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2c090 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2c0a0 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2c0b0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2c0c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2c0d0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2c0e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2c0f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2c100 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2c110 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2c120 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2c130 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2c140 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2c150 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2c160 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2c170 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2c180 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2c190 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
2c1a0 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
2c1b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2c1c0 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
2c1d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
2c1e0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
2c1f0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2c200 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
2c210 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
2c220 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
2c230 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
2c240 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
2c250 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
2c260 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
2c270 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c280 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
2c290 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
2c2a0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
2c2b0 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
2c2c0 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
2c2d0 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
2c2e0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2c2f0 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2c300 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2c310 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2c320 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2c330 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2c340 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2c350 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2c360 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2c370 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2c380 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c390 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2c3a0 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2c3b0 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2c3c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2c3d0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2c3e0 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2c3f0 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2c400 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2c410 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2c420 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2c430 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2c440 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2c450 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2c460 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2c470 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2c480 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
2c490 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
2c4a0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2c4b0 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
2c4c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2c4d0 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
2c4e0 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2c4f0 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
2c500 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
2c510 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
2c520 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
2c530 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
2c540 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
2c550 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
2c560 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
2c570 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
2c580 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2c590 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2c5a0 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
2c5b0 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
2c5c0 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
2c5d0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
2c5e0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c5f0 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
2c600 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
2c610 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c620 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2c630 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2c640 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2c650 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c660 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2c670 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2c680 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
2c690 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2c6a0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2c6b0 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2c6c0 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2c6d0 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2c6e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2c6f0 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2c700 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2c710 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2c720 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  = 1;.    if( zFi
2c730 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2c740 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ame[0] ){.      
2c750 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2c760 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a  te3DbStrDup(0, z
2c770 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2c780 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2c790 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0  ) return SQLI
2c7a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2c7b0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2c7c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2c7d0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2c7e0 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2c7f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2c800 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2c810 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2c820 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2c830 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2c840 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2c850 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2c860 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2c870 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2c880 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2c890 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2c8a0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2c8b0 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2c8c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2c8d0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2c8e0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2c8f0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2c900 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2c910 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2c920 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2c930 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2c940 52 61 77 28 30 2c 20 28 69 36 34 29 6e 50 61 74  Raw(0, (i64)nPat
2c950 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2c960 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2c970 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2c980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2c990 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2c9a0 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2c9b0 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2c9c0 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2c9d0 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2c9e0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2c9f0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2ca00 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2ca10 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2ca20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2ca30 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2ca40 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2ca50 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2ca60 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2ca70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ca80 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2ca90 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2caa0 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2cab0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2cac0 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2cad0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2cae0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2caf0 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2cb00 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2cb10 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2cb20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cb30 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2cb40 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2cb50 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2cb60 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2cb70 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2cb80 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2cb90 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2cba0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2cbb0 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2cbc0 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2cbd0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2cbe0 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2cbf0 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2cc00 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2cc10 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2cc20 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2cc30 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2cc40 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2cc50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2cc60 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2cc70 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2cc80 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2cc90 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2cca0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ccb0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2ccc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2ccd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2ccf0 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2cd00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2cd10 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2cd20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2cd30 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2cd40 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2cd50 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2cd60 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2cd70 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2cd80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2cd90 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2cda0 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2cdb0 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2cdc0 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2cdd0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2cde0 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2cdf0 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2ce00 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2ce10 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2ce20 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2ce30 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2ce40 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2ce50 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2ce60 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2ce70 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2ce80 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2ce90 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2cea0 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2ceb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2cec0 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2ced0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2cee0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2cef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2cf00 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2cf10 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2cf20 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2cf30 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2cf50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2cf60 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2cf70 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2cf80 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2cf90 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2cfa0 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2cfb0 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2cfc0 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2cfd0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2cfe0 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2cff0 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2d000 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2d010 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2d020 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2d030 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2d040 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2d050 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2d060 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2d070 0a 20 20 20 20 28 69 36 34 29 6a 6f 75 72 6e 61  .    (i64)journa
2d080 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
2d090 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2d0a0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2d0b0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2d0c0 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2d0d0 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2d0e0 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2d0f0 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20  e + 8 + 2       
2d100 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2d110 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2d120 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2d130 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2d140 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  4 + 2           
2d150 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2d160 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2d170 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2d180 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2d190 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2d1a0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2d1b0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2d1c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2d1d0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d1e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d1f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
2d200 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2d210 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2d220 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2d230 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2d240 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d250 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2d260 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2d270 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2d280 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2d290 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d2a0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2d2b0 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2d2c0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2d2d0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2d2e0 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2d2f0 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2d300 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2d310 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2d320 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2d330 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2d340 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d350 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2d360 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2d370 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2d380 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2d390 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2d3a0 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2d3b0 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2d3c0 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2d3d0 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2d3e0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2d3f0 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2d400 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2d410 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2d420 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2d430 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d440 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2d450 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2d460 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2d470 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d480 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70  if( nUri ) memcp
2d490 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2d4a0 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2d4b0 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2d4c0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2d4d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2d4e0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d4f0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2d500 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d510 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2d520 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32  ournal\000", 8+2
2d530 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d540 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d550 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d560 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2d570 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d580 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2d590 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2d5a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d5b0 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2d5c0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d5d0 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2d5e0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d5f0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2d600 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2d610 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2d620 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2d630 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2d640 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d650 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2d660 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
2d670 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d680 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2d690 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2d6a0 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2d6b0 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2d6c0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2d6d0 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2d6e0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2d6f0 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2d700 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2d710 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d720 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2d730 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2d740 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2d750 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2d760 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2d770 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d780 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2d790 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2d7a0 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20  ert( !memDb );. 
2d7b0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
2d7c0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
2d7d0 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
2d7e0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
2d7f0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
2d800 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
2d810 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
2d820 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
2d830 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2d840 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
2d850 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
2d860 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2d870 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
2d880 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
2d890 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
2d8a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
2d8b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2d8c0 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
2d8d0 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
2d8e0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2d8f0 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
2d900 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
2d910 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
2d920 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
2d930 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
2d940 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2d950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d960 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
2d970 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
2d980 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2d990 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
2d9a0 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f        if( !readO
2d9b0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nly ){.        s
2d9c0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2d9d0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
2d9e0 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
2d9f0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
2da00 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2da10 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
2da20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2da30 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2da40 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2da50 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2da60 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
2da70 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2da80 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
2da90 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2daa0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
2dab0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2dac0 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
2dad0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2dae0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33  szPageDflt = (u3
2daf0 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  2)pPager->sector
2db00 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2db10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64  }.        }.#ifd
2db20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2db30 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2db40 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2db50 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2db60 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2db70 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
2db80 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
2db90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2dba0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2dbb0 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
2dbc0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2dbd0 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
2dbe0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2dbf0 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
2dc00 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
2dc10 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
2dc20 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2dc30 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
2dc40 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
2dc50 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
2dc60 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
2dc70 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
2dc80 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2dc90 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
2dca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2dcb0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
2dcc0 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
2dcd0 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2dce0 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  = sqlite3_uri_bo
2dcf0 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2dd00 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20   "nolock", 0);. 
2dd10 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20       if( (iDc & 
2dd20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d  SQLITE_IOCAP_IMM
2dd30 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20  UTABLE)!=0.     
2dd40 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69    || sqlite3_uri
2dd50 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61  _boolean(zFilena
2dd60 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c  me, "immutable",
2dd70 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
2dd80 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c   vfsFlags |= SQL
2dd90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2dda0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  Y;.          got
2ddb0 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f  o act_like_temp_
2ddc0 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  file;.      }.  
2ddd0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2dde0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2ddf0 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2de00 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2de10 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2de20 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2de30 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2de40 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2de50 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2de60 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2de70 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2de80 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2de90 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2dea0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2deb0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2dec0 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2ded0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2dee0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2def0 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2df00 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2df10 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2df20 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2df30 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2df40 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2df50 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2df60 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2df70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2df80 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72  is branch also r
2df90 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61  uns for files ma
2dfa0 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c  rked as immutabl
2dfb0 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c  e..    */ .act_l
2dfc0 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20  ike_temp_file:. 
2dfd0 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
2dfe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
2dff0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
2e000 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65  ER;     /* Prete
2e010 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  nd we already ha
2e020 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ve a lock */.   
2e030 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2e040 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2e050 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2e060 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49  e are in EXCLUSI
2e070 56 45 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  VE locking mode 
2e080 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2e090 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2e0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2e0b0 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2e0c0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2e0d0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2e0e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2e0f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2e100 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2e110 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2e120 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2e130 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2e140 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2e150 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2e160 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2e170 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2e180 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2e190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2e1a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2e1b0 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2e1c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2e1d0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2e1e0 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2e1f0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2e200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e210 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2e220 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2e230 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
2e240 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
2e250 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
2e260 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2e270 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2e280 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2e290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e2a0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2e2b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
2e2c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
2e2d0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2e2e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2e2f0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2e300 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2e310 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2e320 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
2e330 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
2e340 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2e350 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
2e360 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
2e370 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2e380 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2e390 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
2e3b0 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
2e3c0 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
2e3d0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
2e3e0 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
2e3f0 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2e400 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2e410 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2e420 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e430 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2e440 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2e450 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2e460 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2e470 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2e480 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2e490 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2e4a0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2e4b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e4c0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2e4d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2e4e0 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2e4f0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2e500 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e510 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2e520 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e530 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2e540 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2e550 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2e560 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2e570 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2e580 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2e590 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2e5a0 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2e5b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e5c0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2e5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2e5e0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2e5f0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2e600 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2e610 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2e620 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2e630 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2e640 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e650 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2e660 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2e670 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2e680 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2e690 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2e6a0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2e6b0 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2e6c0 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2e6d0 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2e6e0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2e6f0 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2e700 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2e710 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e720 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2e730 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2e740 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
2e750 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2e760 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e770 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2e780 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e790 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2e7a0 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2e7b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2e7c0 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2e7d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e7e0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2e7f0 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2e800 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2e810 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2e820 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2e830 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e840 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
2e850 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
2e860 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2e870 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f  RMAL | WAL_SYNC_
2e880 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
2e890 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2e8a0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2e8b0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2e8c0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
2e8d0 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2e8e0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2e8f0 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2e900 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2e910 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2e920 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2e930 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2e940 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2e950 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2e960 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2e970 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2e980 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2e990 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2e9a0 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2e9b0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2e9c0 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2e9d0 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2e9e0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2e9f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ea00 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2ea10 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2ea20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2ea30 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2ea40 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2ea50 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2ea60 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2ea70 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2ea80 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2ea90 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2eaa0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2eab0 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2eac0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2ead0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2eae0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2eaf0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2eb00 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
2eb10 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
2eb20 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20   // will be set 
2eb30 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20  by btree.c */.. 
2eb40 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2eb50 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2eb60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56  ITE_OK;.}.../* V
2eb70 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
2eb80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
2eb90 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20   not be deleted 
2eba0 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66  or renamed out f
2ebb0 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65  rom.** under the
2ebc0 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
2ebd0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2ebe0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69   database is sti
2ebf0 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74  ll were it ought
2ec00 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73  .** to be on dis
2ec10 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  k.  Return non-z
2ec20 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44  ero (SQLITE_READ
2ec30 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20  ONLY_DBMOVED or 
2ec40 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
2ec50 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  .** code from sq
2ec60 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29  lite3OsAccess())
2ec70 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2ec80 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e   has gone missin
2ec90 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2eca0 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
2ecb0 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
2ecc0 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76  ){.  int bHasMov
2ecd0 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ed = 0;.  int rc
2ece0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
2ecf0 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75  >tempFile ) retu
2ed00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ed10 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2ed20 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ze==0 ) return S
2ed30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2ed40 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  rt( pPager->zFil
2ed50 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d  ename && pPager-
2ed60 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b  >zFilename[0] );
2ed70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
2ed80 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
2ed90 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
2eda0 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c  FCNTL_HAS_MOVED,
2edb0 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20   &bHasMoved);.  
2edc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
2edd0 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f  OTFOUND ){.    /
2ede0 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56  * If the HAS_MOV
2edf0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
2ee00 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64  is unimplemented
2ee10 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2ee20 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61  e file.    ** ha
2ee30 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64  s not been moved
2ee40 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68  .  That is the h
2ee50 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69  istorical behavi
2ee60 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72  or of SQLite: pr
2ee70 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65  ior to.    ** ve
2ee80 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20  rsion 3.8.3, it 
2ee90 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f  never checked */
2eea0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2eeb0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2eec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2eed0 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20  & bHasMoved ){. 
2eee0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
2eef0 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b  EADONLY_DBMOVED;
2ef00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ef10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2ef20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ef30 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2ef40 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2ef50 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2ef60 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2ef70 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2ef80 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2ef90 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2efa0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2efb0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2efc0 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2efd0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2efe0 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2eff0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2f000 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2f010 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2f020 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2f030 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2f040 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2f050 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2f060 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2f070 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2f080 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2f090 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2f0a0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2f0b0 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2f0c0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2f0d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2f0e0 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2f0f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2f100 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2f110 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2f120 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2f130 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2f140 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2f150 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2f160 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2f170 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2f180 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2f190 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2f1a0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2f1b0 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2f1c0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2f1d0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2f1e0 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2f1f0 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2f200 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2f210 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2f220 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f230 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2f240 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2f250 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2f260 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2f270 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2f280 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2f290 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2f2a0 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2f2b0 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2f2c0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2f2d0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2f2e0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2f2f0 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2f300 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2f310 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2f320 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2f330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f340 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2f350 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2f360 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2f370 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2f380 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2f390 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2f3a0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2f3b0 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2f3c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f3d0 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2f3e0 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2f3f0 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2f400 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2f410 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2f420 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2f430 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2f440 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2f450 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2f460 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2f470 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2f480 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2f490 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2f4a0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2f4b0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2f4c0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2f4d0 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2f4e0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2f4f0 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2f500 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f510 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2f520 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2f530 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2f540 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2f550 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2f560 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2f570 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2f580 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2f590 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2f5a0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2f5b0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2f5c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2f5d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2f5e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2f5f0 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2f600 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2f610 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2f620 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2f630 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2f640 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2f650 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f660 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2f670 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2f680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2f690 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2f6a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2f6b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2f6c0 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2f6d0 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2f6e0 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2f6f0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2f700 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2f710 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2f720 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2f730 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2f740 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2f750 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2f760 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2f770 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2f780 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2f790 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2f7a0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2f7b0 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2f7c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f7d0 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2f7e0 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2f7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f800 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2f810 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2f820 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
2f830 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
2f840 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
2f850 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2f860 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
2f870 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
2f880 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2f890 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
2f8a0 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
2f8b0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2f8c0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
2f8d0 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
2f8e0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2f8f0 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
2f900 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
2f910 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
2f920 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
2f930 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2f940 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
2f950 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
2f960 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
2f970 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
2f980 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
2f990 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
2f9a0 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
2f9b0 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
2f9c0 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
2f9d0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
2f9e0 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
2f9f0 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
2fa00 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
2fa10 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
2fa20 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
2fa30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
2fa40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2fa50 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
2fa60 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
2fa70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fa80 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
2fa90 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
2faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fab0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2fac0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2fad0 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
2fae0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2faf0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
2fb00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fb10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fb20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2fb30 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61  abase is zero pa
2fb40 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61  ges in size, tha
2fb50 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
2fb60 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20 20  her (1) the.    
2fb70 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
2fb80 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d  s a remnant from
2fb90 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61 73   a prior databas
2fba0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2fbb0 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20  name where.     
2fbc0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2fbd0 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20  se file but not 
2fbe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
2fbf0 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20  deleted, or (2) 
2fc00 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20  the initial.    
2fc10 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
2fc20 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65  on that populate
2fc30 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  s a new database
2fc40 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
2fc50 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
2fc60 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
2fc70 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
2fc80 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  le can be delete
2fc90 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b  d.  However, tak
2fca0 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a  e care.        *
2fcb0 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20  * not to delete 
2fcc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fcd0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2fce0 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20  y open due to.  
2fcf0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
2fd00 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20  _mode=PERSIST.. 
2fd10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fd20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26    if( nPage==0 &
2fd30 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  & !jrnlOpen ){. 
2fd40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2fd50 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
2fd60 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
2fd70 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70  f( pagerLockDb(p
2fd80 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
2fd90 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
2fda0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fdb0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
2fdc0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2fdd0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
2fde0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2fdf0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2fe00 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b  de ) pagerUnlock
2fe10 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2fe20 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
2fe30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2fe40 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
2fe50 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2fe60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fe70 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
2fe80 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2fe90 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2fea0 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72  tion has a reser
2feb0 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ved.          **
2fec0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2fed0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2fee0 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b   file. Now check
2fef0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20   that there is. 
2ff00 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c           ** at l
2ff10 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72  east one non-zer
2ff20 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73  o bytes at the s
2ff30 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2ff40 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
2ff50 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
2ff60 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73  is, then we cons
2ff70 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61  ider this journa
2ff80 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20  l to be hot. If 
2ff90 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  not, .          
2ffa0 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e  ** it can be ign
2ffb0 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ored..          
2ffc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2ffd0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2ffe0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
2fff0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
30000 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
30010 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
30020 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30030 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
30040 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
30050 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
30060 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20  jfd, f, &f);.   
30070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30080 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
300a0 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
300b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
300c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
300d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
300e0 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
300f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
30100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30110 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
30120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30130 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30150 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30160 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
30170 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30180 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
30190 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
301a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
301b0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
301c0 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
301d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
301e0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
301f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30200 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
30210 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
30220 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
30230 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
30240 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
30250 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
30260 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
30270 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
30280 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
30290 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
302a0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
302b0 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
302c0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
302d0 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
302e0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
302f0 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
30300 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
30310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
30320 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
30330 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
30340 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
30350 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
30360 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
30370 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
30380 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
30390 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
303a0 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
303b0 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
303c0 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
303d0 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
303e0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
303f0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
30400 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
30410 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
30420 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
30430 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
30440 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
30450 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
30460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30470 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
30480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30490 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
304a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
304b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
304c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
304d0 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
304e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
304f0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
30500 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
30510 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
30520 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
30530 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
30540 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
30550 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
30560 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
30570 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30580 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
30590 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
305a0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
305b0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
305c0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
305d0 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
305e0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
305f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
30600 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
30610 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
30620 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
30630 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
30640 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
30650 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
30660 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
30670 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
30680 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
30690 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
306a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
306b0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
306c0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
306d0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
306e0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
306f0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
30700 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
30710 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
30720 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
30730 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
30740 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
30750 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
30760 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
30770 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
30780 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
30790 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
307a0 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
307b0 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
307c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
307d0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
307e0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
307f0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
30800 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
30810 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
30820 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
30830 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
30840 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
30850 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
30860 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
30870 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
30880 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
30890 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
308a0 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
308b0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
308c0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
308d0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
308e0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
308f0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
30900 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
30910 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
30920 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
30930 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
30940 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
30950 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
30960 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
30970 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
30980 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
30990 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
309a0 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
309b0 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
309c0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
309d0 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
309e0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
309f0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
30a00 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
30a10 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
30a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
30a30 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
30a40 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
30a50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30a70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
30a80 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
30a90 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
30aa0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
30ab0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
30ac0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
30ad0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
30ae0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
30af0 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
30b00 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
30b10 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
30b20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
30b30 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
30b40 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
30b50 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
30b60 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
30b70 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
30b80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
30b90 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
30ba0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
30bb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
30bc0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
30bd0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
30be0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30bf0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30c00 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
30c10 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
30c20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
30c30 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
30c40 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
30c50 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
30c60 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
30c70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
30c80 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
30c90 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30ca0 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
30cb0 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
30cc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30cd0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
30ce0 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
30cf0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
30d00 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72  !MEMDB );..    r
30d10 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
30d20 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
30d30 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
30d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30d50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
30d60 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
30d70 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
30d80 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
30d90 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
30da0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30db0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30dc0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
30dd0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
30de0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
30df0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
30e00 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
30e10 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
30e20 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
30e30 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
30e40 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
30e50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
30e60 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
30e70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
30e80 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
30e90 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
30ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30ec0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
30ed0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
30ee0 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
30ef0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
30f00 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
30f10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30f20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
30f30 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
30f40 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
30f50 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
30f60 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
30f70 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30f80 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
30f90 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
30fa0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
30fb0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
30fc0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
30fd0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
30fe0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
30ff0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
31000 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
31010 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
31020 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
31030 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
31040 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
31050 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
31060 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
31070 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31080 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
31090 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
310a0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
310b0 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
310c0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
310d0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
310e0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
310f0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
31100 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
31110 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
31120 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
31130 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
31140 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
31150 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
31160 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
31170 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
31180 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
31190 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
311a0 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
311b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
311c0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
311d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
311e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
311f0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
31200 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
31210 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
31220 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
31230 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
31240 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
31250 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
31260 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
31270 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31280 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
31290 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
312a0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
312b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
312c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
312d0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
312e0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
312f0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
31300 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
31310 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
31320 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
31330 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
31340 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
31350 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
31360 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
31370 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
31380 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
31390 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
313a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
313b0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
313c0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
313d0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
313e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
313f0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
31400 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
31410 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
31420 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
31430 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
31440 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
31450 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
31460 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
31470 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
31480 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
31490 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
314a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
314b0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
314c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
314d0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
314e0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
314f0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
31500 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
31510 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
31520 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
31530 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
31540 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
31550 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
31560 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
31570 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
31580 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
31590 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
315a0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
315b0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
315c0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
315d0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
315e0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
315f0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
31600 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
31610 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31620 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31630 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
31640 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
31650 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
31660 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
31670 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31680 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
31690 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
316a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
316b0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
316c0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
316d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
316e0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
316f0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
31700 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31710 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
31720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
31730 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
31740 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
31750 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
31760 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
31770 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
31780 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31790 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
317a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
317b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
317c0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
317d0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
317e0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
317f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
31800 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
31810 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
31820 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
31830 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31840 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
31850 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
31860 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
31870 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31880 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
31890 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
318a0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
318b0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
318c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
318d0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
318e0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
318f0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
31900 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
31910 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
31920 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
31930 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
31940 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
31950 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
31960 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
31970 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
31980 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
31990 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
319a0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
319b0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
319c0 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
319d0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
319e0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
319f0 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
31a00 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
31a10 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
31a20 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
31a30 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
31a40 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
31a50 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
31a60 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
31a70 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
31a80 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
31a90 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
31aa0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31ab0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
31ac0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
31ad0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
31ae0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
31af0 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
31b00 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
31b10 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
31b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31b30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
31b40 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
31b50 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
31b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
31b70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
31b80 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
31b90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
31ba0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31bb0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
31bc0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
31bd0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
31be0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
31bf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
31c10 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
31c20 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
31c30 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
31c40 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
31c50 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
31c60 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
31c70 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
31c80 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
31c90 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
31ca0 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
31cb0 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
31cc0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
31cd0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
31ce0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
31cf0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
31d00 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
31d10 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
31d20 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
31d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
31d40 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
31d50 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
31d60 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
31d70 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
31d80 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
31d90 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
31da0 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
31db0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31dc0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
31dd0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
31de0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
31df0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
31e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
31e10 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
31e20 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
31e30 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
31e40 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
31e50 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
31e60 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
31e70 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
31e80 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
31e90 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
31ea0 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
31eb0 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
31ec0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
31ed0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
31ee0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
31ef0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
31f00 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
31f10 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
31f20 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
31f30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
31f40 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
31f50 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
31f60 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
31f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
31f80 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
31f90 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
31fa0 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
31fb0 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
31fc0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
31fd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31fe0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
31ff0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
32000 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32010 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
32020 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32030 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32040 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
32050 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
32060 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
32070 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
32080 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
32090 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
320a0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
320b0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
320c0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
320d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 28  r->tempFile && (
320e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
320f0 3e 70 42 61 63 6b 75 70 20 0a 20 20 20 20 20 7c  >pBackup .     |
32100 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
32110 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
32120 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20  >pPCache)>0 .   
32130 20 20 7c 7c 20 55 53 45 46 45 54 43 48 28 70 50    || USEFETCH(pP
32140 61 67 65 72 29 0a 20 20 20 20 29 29 7b 0a 20 20  ager).    )){.  
32150 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
32160 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
32170 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
32180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32190 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  le.      ** and 
321a0 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
321b0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
321c0 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
321d0 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72  vious.      ** r
321e0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
321f0 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
32200 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
32210 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
32220 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
32230 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
32240 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
32250 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
32260 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
32270 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
32280 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
32290 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
322a0 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
322b0 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
322c0 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
322d0 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
322e0 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
322f0 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
32300 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
32310 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
32320 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
32330 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
32340 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
32350 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
32360 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
32370 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
32380 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
32390 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
323a0 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
323b0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
323c0 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
323d0 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
323e0 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
323f0 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
32400 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
32410 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
32420 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
32430 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
32440 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
32450 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
32460 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e      */.      Pgn
32470 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  o nPage = 0;.   
32480 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
32490 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
324a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
324b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
324c0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
324d0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
324e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
324f0 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69  failed;..      i
32500 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
32510 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
32520 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
32530 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
32540 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
32550 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32560 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
32570 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
32580 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
32590 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
325a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
325b0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
325c0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
325d0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
325e0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
325f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
32610 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
32620 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
32630 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
32640 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
32650 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
32660 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
32670 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
32680 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
32690 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
326a0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  (pPager);..     
326b0 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20     /* Unmap the 
326c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
326d0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
326e0 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63  at external proc
326f0 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  esses.        **
32700 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61   may have trunca
32710 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ted the database
32720 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65   file and then e
32730 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a  xtended it back.
32740 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74          ** to it
32750 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20  s original size 
32760 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
32770 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69  ss was not holdi
32780 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  ng a lock..     
32790 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
327a0 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69  se there may exi
327b0 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20  st a Pager.pMap 
327c0 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70  mapping that app
327d0 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ears.        ** 
327e0 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20  to be the right 
327f0 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20  size but is not 
32800 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20  actually valid. 
32810 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20  Avoid this.     
32820 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74     ** possibilit
32830 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74  y by unmapping t
32840 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20  he db here. */. 
32850 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45         if( USEFE
32860 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20  TCH(pPager) ){. 
32870 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32880 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
32890 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
328a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
328b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
328c0 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66  there is a WAL f
328d0 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
328e0 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69  system, open thi
328f0 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41  s database in WA
32900 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f  L.    ** mode. O
32910 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f  therwise, the fo
32920 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
32930 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
32940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
32950 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  = pagerOpenWalIf
32960 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b  Present(pPager);
32970 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32980 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73  OMIT_WAL.    ass
32990 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
329a0 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  l==0 || rc==SQLI
329b0 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a  TE_OK );.#endif.
329c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
329d0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
329e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
329f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
32a00 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
32a10 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
32a20 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  n(pPager);.  }..
32a30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
32a40 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32a50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
32a60 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
32a70 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
32a80 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  ger, &pPager->db
32a90 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  Size);.  }.. fai
32aa0 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
32ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32ac0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
32ad0 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  ;.    pager_unlo
32ae0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
32af0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32b00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32b10 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EN );.  }else{. 
32b20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32b30 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
32b40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
32b50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
32b60 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
32b70 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
32b80 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
32b90 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
32ba0 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
32bb0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
32bc0 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
32bd0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
32be0 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
32bf0 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
32c00 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
32c10 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
32c20 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
32c30 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
32c40 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
32c50 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
32c60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
32c70 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
32c80 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
32c90 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
32ca0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
32cb0 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f  ( pPager->nMmapO
32cc0 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65  ut==0 && (sqlite
32cd0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
32ce0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
32cf0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ==0) ){.    page
32d00 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
32d10 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
32d20 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
32d30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
32d40 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
32d50 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
32d60 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
32d70 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
32d80 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
32d90 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
32da0 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
32db0 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
32dc0 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
32dd0 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
32de0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
32df0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
32e00 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
32e10 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
32e20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
32e30 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
32e40 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
32e50 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
32e60 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
32e70 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
32e80 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
32e90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
32ea0 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
32eb0 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
32ec0 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
32ed0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
32ee0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
32ef0 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
32f00 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
32f10 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
32f20 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
32f30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
32f40 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
32f50 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
32f60 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
32f70 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
32f80 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
32f90 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
32fa0 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
32fb0 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
32fc0 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
32fd0 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
32fe0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32ff0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
33000 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
33010 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
33020 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
33030 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
33040 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
33050 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
33060 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
33070 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
33080 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a   page or if a .*
33090 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
330a0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
330b0 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61  e noContent para
330c0 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a  meter and the .*
330d0 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  * requested page
330e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
330f0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
33100 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a  che, then no .**
33110 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61   actual disk rea
33120 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69  d occurs. In thi
33130 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  s case the memor
33140 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a  y image of the .
33150 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ** page is initi
33160 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65  alized to all ze
33170 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ros. .**.** If n
33180 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
33190 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
331a0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
331b0 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
331c0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
331d0 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
331e0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
331f0 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
33200 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
33210 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
33220 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
33230 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
33240 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
33250 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
33260 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
33270 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
33280 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
33290 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
332a0 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
332b0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
332c0 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
332d0 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
332e0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
332f0 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
33300 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
33310 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
33320 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
33330 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
33340 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
33350 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
33360 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
33370 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
33380 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
33390 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
333a0 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
333b0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
333c0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
333d0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
333e0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
333f0 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
33400 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
33410 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
33420 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
33430 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
33440 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
33450 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
33460 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
33470 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
33480 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
33490 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
334a0 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
334b0 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
334c0 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
334d0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
334e0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
334f0 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
33500 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
33510 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
33520 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
33530 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
33540 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
33550 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
33560 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
33570 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
33580 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
33590 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
335a0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
335b0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
335c0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
335d0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
335e0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
335f0 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
33600 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
33610 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
33620 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
33630 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
33640 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
33650 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
33660 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
33670 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
33680 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
33690 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
336a0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
336b0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
336c0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
336d0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
336e0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
336f0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
33700 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
33710 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33720 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
33730 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
33740 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
33750 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
33760 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
33770 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
33780 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
33790 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
337a0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
337b0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
337c0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
337d0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
337e0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
337f0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
33800 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
33810 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33820 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ;.  PgHdr *pPg =
33830 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65   0;.  u32 iFrame
33840 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33850 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74        /* Frame t
33860 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20  o read from WAL 
33870 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  file */.  const 
33880 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20  int noContent = 
33890 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
338a0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a  ET_NOCONTENT);..
338b0 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70    /* It is accep
338c0 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72  table to use a r
338d0 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20  ead-only (mmap) 
338e0 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67  page for any pag
338f0 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61  e except.  ** pa
33900 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73  ge 1 if there is
33910 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
33920 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68  ction open or th
33930 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e  e ACQUIRE_READON
33940 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73  LY.  ** flag was
33950 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
33960 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f  e caller. And so
33970 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20   long as the db 
33980 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74  is not a .  ** t
33990 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
339a0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
339b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
339c0 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21  bMmapOk = (pgno!
339d0 3d 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70  =1 && USEFETCH(p
339e0 50 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50  Pager).   && (pP
339f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33a00 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66  GER_READER || (f
33a10 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
33a20 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64  _READONLY)).#ifd
33a30 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
33a40 44 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72  DEC.   && pPager
33a50 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64  ->xCodec==0.#end
33a60 69 66 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  if.  );..  asser
33a70 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33a80 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
33a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
33aa0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
33ab0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
33ac0 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  ert( noContent==
33ad0 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20  0 || bMmapOk==0 
33ae0 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  );..  if( pgno==
33af0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
33b00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33b10 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
33b20 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
33b30 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
33b40 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
33b50 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
33b60 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
33b70 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
33b80 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
33b90 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
33ba0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
33bb0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e!=SQLITE_OK ){.
33bc0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
33bd0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
33be0 65 7b 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61  e{..    if( bMma
33bf0 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57  pOk && pagerUseW
33c00 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
33c10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33c20 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
33c30 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
33c40 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
33c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33c60 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
33c70 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
33c80 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61   }..    if( bMma
33c90 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30  pOk && iFrame==0
33ca0 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
33cb0 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20  pData = 0;..    
33cc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
33cd0 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  Fetch(pPager->fd
33ce0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 69 36  , .          (i6
33cf0 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
33d00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
33d10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
33d20 20 26 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b   &pData.      );
33d30 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
33d40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
33d50 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ta ){.        if
33d60 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33d70 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b  >PAGER_READER ){
33d80 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
33d90 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65  )sqlite3PcacheFe
33da0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
33db0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
33dc0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Pg);.        }. 
33dd0 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d         if( pPg==
33de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
33df0 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65  c = pagerAcquire
33e00 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20  MapPage(pPager, 
33e10 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50  pgno, pData, &pP
33e20 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  g);.        }els
33e30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
33e40 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
33e50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
33e60 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
33e70 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
33e80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33e90 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
33ea0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
33eb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50  ;.          *ppP
33ed0 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  age = pPg;.     
33ee0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33ef0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
33f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33f10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33f20 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
33f30 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
33f40 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
33f50 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  }..    rc = sqli
33f60 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
33f70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
33f80 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29  pgno, 1, ppPage)
33f90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
33fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33fb0 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
33fc0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
33fd0 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
33fe0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
33ff0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
34000 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
34010 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
34020 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
34030 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
34040 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
34050 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
34060 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
34070 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
34080 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
34090 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
340a0 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
340b0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
340c0 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
340d0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
340e0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
340f0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
34100 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
34110 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
34120 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
34130 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
34140 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
34150 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
34160 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
34170 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
34180 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
34190 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
341a0 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
341b0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
341c0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
341d0 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
341e0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
341f0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
34200 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  t[PAGER_STAT_HIT
34210 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]++;.    return 
34220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
34230 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
34240 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
34250 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
34260 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
34270 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
34280 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
34290 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20    */..    pPg = 
342a0 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67  *ppPage;.    pPg
342b0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
342c0 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  r;..    /* The m
342d0 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
342e0 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
342f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34300 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20  T if a page.    
34310 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
34320 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
34330 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69  the unused locki
34340 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75  ng-page, is requ
34350 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
34360 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
34370 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
34380 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
34390 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
343a0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
343b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
343c0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
343d0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
343e0 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50   if( MEMDB || pP
343f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e  ager->dbSize<pgn
34400 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c  o || noContent |
34410 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
34420 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
34430 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
34440 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
34450 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
34460 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  LL;.        goto
34470 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34480 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34490 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20    if( noContent 
344a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
344b0 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
344c0 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
344d0 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
344e0 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
344f0 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65        ** It mere
34500 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  ly means that we
34510 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65   might do some e
34520 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75  xtra work to jou
34530 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20  rnal a .        
34540 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  ** page that doe
34550 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
34560 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76   journaled.  Nev
34570 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75  ertheless, be su
34580 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  re .        ** t
34590 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20  o test the case 
345a0 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65  where a malloc e
345b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
345c0 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20  e trying to set 
345d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69  .        ** a bi
345e0 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f  t in a bit vecto
345f0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
34600 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
34610 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
34620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
34630 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
34640 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
34650 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
34660 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76   = ) sqlite3Bitv
34670 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
34680 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
34690 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
346a0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
346b0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
346c0 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f   }.        TESTO
346d0 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
346e0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
346f0 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  s(pPager, pgno);
34700 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
34710 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
34720 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73  MEM );.        s
34730 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
34740 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d  alloc();.      }
34750 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
34760 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
34770 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
34780 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
34790 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
347a0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
347b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
347c0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
347d0 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70  pPager) && bMmap
347e0 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Ok==0 ){.       
347f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
34800 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
34810 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
34820 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  Frame);.        
34830 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34840 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
34850 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34860 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
34870 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
34880 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70  Pager );.      p
34890 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
348a0 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b  ER_STAT_MISS]++;
348b0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
348c0 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61  DbPage(pPg, iFra
348d0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
348e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
348f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
34900 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34910 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34920 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
34930 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  hash(pPg);.  }..
34940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34950 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
34960 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
34970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34980 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
34990 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
349a0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
349b0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
349c0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a  nused(pPager);..
349d0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
349e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
349f0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
34a00 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
34a10 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
34a20 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
34a30 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
34a40 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
34a50 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
34a60 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
34a70 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
34a80 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
34a90 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20  che. .**.** See 
34aa0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
34ab0 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
34ac0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
34ad0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
34ae0 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
34af0 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
34b00 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
34b10 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
34b20 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
34b30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
34b40 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
34b50 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
34b60 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
34b70 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
34b80 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
34b90 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
34ba0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
34bb0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
34bc0 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
34bd0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
34be0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
34bf0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
34c00 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
34c10 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
34c20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
34c30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
34c40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
34c50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
34c60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
34c70 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
34c80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
34c90 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
34ca0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34cb0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
34cc0 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
34cd0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
34ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
34cf0 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
34d00 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
34d10 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
34d20 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
34d30 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
34d40 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
34d50 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
34d60 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
34d70 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
34d80 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
34d90 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
34da0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
34db0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
34dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
34dd0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
34de0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
34df0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62  rUnrefNotNull(Db
34e00 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
34e10 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61  ger *pPager;.  a
34e20 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b  ssert( pPg!=0 );
34e30 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d  .  pPager = pPg-
34e40 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
34e50 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
34e60 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61  R_MMAP ){.    pa
34e70 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
34e80 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
34e90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
34ea0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
34eb0 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
34ec0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
34ed0 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
34ee0 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
34ef0 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
34f00 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67  pPg ) sqlite3Pag
34f10 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
34f20 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
34f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
34f40 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
34f50 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
34f60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
34f70 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
34f80 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
34f90 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
34fa0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
34fb0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
34fc0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
34fd0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
34fe0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
34ff0 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
35000 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
35010 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
35020 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
35030 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
35040 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
35050 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
35060 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
35070 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
35080 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
35090 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
350a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
350b0 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
350c0 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
350d0 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
350e0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
350f0 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
35100 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
35110 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
35120 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
35130 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
35140 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
35150 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
35160 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
35170 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
35180 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35190 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
351a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
351b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
351c0 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
351d0 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
351e0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
351f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35200 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
35210 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
35220 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
35230 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
35240 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
35250 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
35260 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
35270 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
35280 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
35290 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
352a0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
352b0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
352c0 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
352d0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
352e0 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
352f0 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
35300 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
35310 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
35320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35330 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
35340 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
35350 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35360 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
35370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35380 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
35390 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
353a0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
353b0 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
353c0 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
353d0 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
353e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
353f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35400 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
35410 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
35420 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
35430 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
35440 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
35450 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
35460 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
35470 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
35480 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
35490 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
354a0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
354b0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
354c0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
354d0 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
354e0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
354f0 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
35500 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
35510 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
35520 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
35530 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
35540 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
35550 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
35560 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
35570 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35580 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61  E_OFF ){.    pPa
35590 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
355a0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
355b0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
355c0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
355d0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
355e0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
355f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
35600 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  M;.    }.  .    
35610 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
35620 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
35630 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
35640 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
35650 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
35660 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
35670 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35680 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
35690 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
356a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
356b0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
356c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
356d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
356e0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
356f0 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
35700 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
35710 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
35720 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
35730 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
35740 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
35750 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
35760 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
35770 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
35780 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
35790 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
357a0 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
357b0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a  N_TEMP_JOURNAL):
357c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
357d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
357e0 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
357f0 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    );..        /*
35800 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
35810 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20   database still 
35820 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
35830 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e  e as it did when
35840 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77  .        ** it w
35850 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  as originally op
35860 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ened. */.       
35870 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73   rc = databaseIs
35880 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b  Unmoved(pPager);
35890 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
358a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
358b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
358c0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
358d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
358e0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
358f0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
35900 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
35910 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
35920 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
35930 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
35940 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  er).          );
35950 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
35960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
35970 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
35980 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
35990 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
359a0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
359b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
359c0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
359d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
359e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
359f0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
35a00 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
35a10 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
35a20 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
35a30 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
35a40 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
35a50 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
35a60 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
35a70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35a80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
35a90 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
35aa0 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
35ab0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
35ac0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
35ad0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
35ae0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
35af0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
35b00 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
35b10 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
35b20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
35b30 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
35b40 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
35b50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
35b60 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
35b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35b80 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
35b90 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
35ba0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
35bb0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35bc0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
35bd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35be0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35bf0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
35c00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
35c10 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
35c20 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
35c30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
35c40 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
35c50 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
35c60 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
35c70 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
35c80 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
35c90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
35ca0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
35cb0 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
35cc0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
35cd0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
35ce0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
35cf0 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
35d00 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
35d10 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
35d20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35d30 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
35d40 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
35d50 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
35d60 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
35d70 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
35d80 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
35d90 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
35da0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
35db0 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
35dc0 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
35dd0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
35de0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
35df0 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
35e00 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
35e10 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
35e20 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
35e30 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
35e40 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
35e50 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
35e60 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
35e70 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
35e80 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
35e90 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
35ea0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
35eb0 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
35ec0 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
35ed0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
35ee0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
35ef0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
35f00 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
35f10 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
35f20 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
35f30 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
35f40 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
35f50 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
35f60 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
35f70 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
35f80 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
35f90 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
35fa0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
35fb0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
35fc0 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
35fd0 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
35fe0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35ff0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
36000 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
36010 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
36020 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
36030 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36040 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
36050 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
36060 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
36070 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
36080 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
36090 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
360a0 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
360b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
360c0 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
360d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
360e0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
360f0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
36100 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
36110 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
36120 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
36130 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
36140 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
36150 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
36160 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
36170 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36180 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
36190 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
361a0 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
361b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
361c0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
361d0 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  && sqlite3WalExc
361e0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
361f0 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a  r->pWal, -1) ){.
36200 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
36210 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
36220 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
36230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36250 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
36260 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
36270 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
36280 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
36290 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
362a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
362b0 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
362c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
362d0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
362e0 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
362f0 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
36300 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
36310 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
36320 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
36330 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
36340 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
36350 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
36360 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
36370 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
36380 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
36390 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
363a0 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
363b0 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
363c0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
363d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
363e0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
363f0 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
36400 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
36410 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
36420 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
36430 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
36440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36450 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
36460 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
36470 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
36480 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
36490 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
364a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
364b0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
364c0 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
364d0 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
364e0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
364f0 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
36500 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
36510 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
36520 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
36530 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
36540 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
36550 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
36560 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
36570 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
36580 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
36590 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
365a0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
365b0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
365c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
365d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
365e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
365f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
36600 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
36610 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
36620 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36630 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
36640 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
36650 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36660 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
36670 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
36680 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
36690 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
366a0 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
366b0 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
366c0 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
366d0 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
366e0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
366f0 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
36700 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
36710 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
36720 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
36730 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
36740 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
36750 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
36760 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
36770 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
36780 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
36790 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
367a0 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
367b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
367c0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
367d0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
367e0 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
367f0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
36800 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
36810 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
36820 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
36830 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36840 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
36850 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36860 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
36880 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
36890 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
368a0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
368b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
368c0 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
368d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
368e0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
368f0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36900 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73  LOCKED );.    as
36910 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
36920 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
36930 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52   );.  }..  PAGER
36940 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
36950 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
36960 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
36970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36980 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
36990 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
369a0 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
369b0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
369c0 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
369d0 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
369e0 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
369f0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
36a00 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
36a10 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
36a20 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
36a30 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
36a40 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
36a50 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
36a60 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
36a70 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
36a80 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
36a90 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
36aa0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
36ab0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
36ac0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
36ad0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
36ae0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
36af0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
36b00 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
36b10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
36b20 69 6e 4a 6f 75 72 6e 61 6c 3b 0a 0a 20 20 2f 2a  inJournal;..  /*
36b30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
36b40 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
36b50 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ss a write-trans
36b60 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
36b70 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74  dy .  ** been st
36b80 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e  arted. The journ
36b90 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
36ba0 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61  ay not be open a
36bb0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
36bc0 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63  ** It is never c
36bd0 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52  alled in the ERR
36be0 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  OR state..  */. 
36bf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36c00 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
36c10 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
36c20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
36c30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36c40 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
36c50 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
36c60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36c70 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
36c80 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36c90 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36ca0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
36cb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36cc0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
36cd0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
36ce0 79 3d 3d 30 20 29 3b 0a 0a 20 20 43 48 45 43 4b  y==0 );..  CHECK
36cf0 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
36d00 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
36d10 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f  le needs to be o
36d20 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65  pened. Higher le
36d30 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76  vel routines hav
36d40 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f  e already.  ** o
36d50 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65  btained the nece
36d60 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62  ssary locks to b
36d70 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74  egin the write-t
36d80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
36d90 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  the.  ** rollbac
36da0 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  k journal might 
36db0 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e  not yet be open.
36dc0 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20   Open it now if 
36dd0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
36de0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
36df0 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
36e00 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
36e10 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
36e20 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20   on the page. . 
36e30 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
36e40 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61  f it were done a
36e50 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c  fter calling sql
36e60 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
36e70 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a  rty(), then.  **
36e80 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20   an error might 
36e90 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70 61  occur and the pa
36ea0 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70  ger would end up
36eb0 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   in WRITER_LOCKE
36ec0 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74  D state.  ** wit
36ed0 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61  h pages marked a
36ee0 73 20 64 69 72 74 79 20 69 6e 20 74 68 65 20 63  s dirty in the c
36ef0 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
36f00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36f10 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
36f20 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  CKED ){.    rc =
36f30 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
36f40 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
36f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36f60 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
36f70 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
36f80 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
36f90 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
36fa0 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
36fb0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
36fc0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
36fd0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
36fe0 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
36ff0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
37000 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
37010 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
37020 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
37030 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
37040 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
37050 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
37060 72 74 79 28 70 50 67 29 3b 0a 20 20 69 6e 4a 6f  rty(pPg);.  inJo
37070 75 72 6e 61 6c 20 3d 20 70 61 67 65 49 6e 4a 6f  urnal = pageInJo
37080 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50  urnal(pPager, pP
37090 67 29 3b 0a 20 20 69 66 28 20 69 6e 4a 6f 75 72  g);.  if( inJour
370a0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
370b0 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c  nSavepoint==0 ||
370c0 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
370d0 67 65 28 70 50 67 29 29 20 29 7b 0a 20 20 20 20  ge(pPg)) ){.    
370e0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
370f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
37100 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
37110 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
37120 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
37130 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
37140 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
37150 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
37160 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
37170 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
37180 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
37190 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
371a0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
371b0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
371c0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
371d0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
371e0 0a 20 20 20 20 69 66 28 20 21 69 6e 4a 6f 75 72  .    if( !inJour
371f0 6e 61 6c 20 26 26 20 21 70 61 67 65 72 55 73 65  nal && !pagerUse
37200 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
37210 20 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67       assert( pag
37220 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
37230 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
37240 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
37250 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26  er->dbOrigSize &
37260 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
37270 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
37280 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
37290 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
372a0 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f  ;.        i64 iO
372b0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
372c0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20  rnalOff;..      
372d0 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
372e0 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
372f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
37300 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
37310 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
37320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
37330 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
37340 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
37350 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
37360 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
37370 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
37380 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
37390 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
373a0 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  r) );..        a
373b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
373c0 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65  ournalHdr<=pPage
373d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
373e0 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
373f0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
37400 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
37410 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
37420 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
37430 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
37440 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
37450 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
37460 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
37470 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
37480 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
37490 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e  curs while journ
374a0 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  alling the.     
374b0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
374c0 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
374d0 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
374e0 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
374f0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ge..        ** O
37500 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
37510 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
37520 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
37530 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20  he logic in.    
37540 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f      ** playback_
37550 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
37560 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
37570 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
37580 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  restored.       
37590 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
375a0 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
375b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
375c0 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
375d0 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
375e0 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
375f0 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20  ay follow..     
37600 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
37610 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
37620 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20  R_NEED_SYNC;..  
37630 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
37640 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
37650 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70  fd, iOff, pPg->p
37660 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
37670 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37680 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
37690 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
376a0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
376b0 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
376c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
376d0 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20  iOff+4);.       
376e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
376f0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37700 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
37710 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
37720 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65  >jfd, iOff+pPage
37730 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63  r->pageSize+4, c
37740 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  ksum);.        i
37750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37760 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
37770 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
37780 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
37790 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
377a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
377b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
377c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
377d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
377e0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
377f0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
37800 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
37810 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
37820 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
37830 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
37840 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
37850 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
37860 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
37870 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
37880 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
37890 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
378a0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
378b0 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
378c0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
378d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
378e0 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61  alOff += 8 + pPa
378f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
37900 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
37910 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
37920 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
37930 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
37940 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37950 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
37960 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37970 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
37980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
37990 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
379a0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
379b0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
379c0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
379d0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
379e0 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
379f0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
37a00 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
37a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
37a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37a30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37a40 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
37a50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
37a60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
37a70 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
37a80 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
37a90 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
37aa0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
37ab0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
37ac0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
37ad0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
37ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
37af0 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
37b00 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
37b10 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
37b20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
37b30 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
37b40 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
37b50 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
37b60 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
37b70 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
37b80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
37b90 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
37ba0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
37bb0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
37bc0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
37bd0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
37be0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
37bf0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
37c00 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
37c10 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
37c20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
37c30 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
37c40 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
37c50 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
37c60 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
37c70 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
37c80 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
37c90 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
37ca0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
37cb0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
37cc0 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
37cd0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
37ce0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
37cf0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
37d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
37d10 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
37d20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
37d30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
37d40 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
37d50 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
37d60 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
37d70 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
37d80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37d90 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
37da0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
37db0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
37dc0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
37dd0 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
37de0 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
37df0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
37e00 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
37e10 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
37e20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
37e30 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
37e40 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
37e50 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
37e60 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
37e70 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
37e80 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
37e90 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
37ea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
37eb0 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
37ec0 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
37ed0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
37ee0 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
37ef0 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
37f00 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
37f10 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
37f20 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
37f30 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
37f40 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
37f50 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
37f60 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
37f70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37f80 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
37f90 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
37fa0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
37fb0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
37fc0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
37fd0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
37fe0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
37ff0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
38000 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
38010 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
38020 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
38030 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
38040 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
38050 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
38060 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
38070 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
38080 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
38090 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
380a0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
380b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
380c0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
380d0 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
380e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
380f0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
38100 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
38110 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
38120 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
38130 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
38140 69 7a 65 20 3e 20 28 75 33 32 29 70 50 61 67 65  ize > (u32)pPage
38150 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
38160 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
38170 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
38180 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
38190 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
381a0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
381b0 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
381c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
381d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
381e0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
381f0 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
38200 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20  t nPage = 0;    
38210 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
38220 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
38230 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
38240 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
38250 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
38260 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
38270 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
38280 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
38290 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
382a0 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
382b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
382c0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  */.    Pgno nPag
382d0 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
382e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
382f0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
38300 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  e);..    /* Set 
38310 74 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  the doNotSpill N
38320 4f 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20  OSYNC bit to 1. 
38330 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
38340 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a  we cannot allow.
38350 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c      ** a journal
38360 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
38370 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
38380 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
38390 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73  d by.    ** this
383a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
383b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
383c0 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
383d0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
383e0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
383f0 4c 41 47 5f 4e 4f 53 59 4e 43 29 3d 3d 30 20 29  LAG_NOSYNC)==0 )
38400 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
38410 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
38420 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b 0a 0a 20  LFLAG_NOSYNC;.. 
38430 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
38440 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
38450 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
38460 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
38470 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
38480 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
38490 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
384a0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
384b0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
384c0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
384d0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
384e0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
384f0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
38500 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
38510 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
38520 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
38530 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
38540 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
38550 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
38560 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
38570 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
38580 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
38590 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
385a0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
385b0 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
385c0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
385d0 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
385e0 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
385f0 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
38600 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
38610 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
38620 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
38630 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
38640 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
38650 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70